docker(一)--基础命令

什么是容器
一种虚拟化的方案
操作系统级别的虚拟化
只能运行相同或相似内核的操作系统
依赖于linux内核特性:namespace和cgroups(control group)


linux namespaces 命名空间

通过namespaces将以下资源隔离:

uts(unix timesharing system)主机名和域名
ipc(inter-process communication)信号量、消息队列和共享内存 跨进程通信的访问
pid(processid) 进程编号
net(network) 管理网络接口,网络设备、网络栈、端口等
mnt(mount) 管理挂载点(文件系统)
user 用户和用户组

 

control groups(cgroups)控制组 用户空间的资源分配

blkio:块设备io
cpu:cpu
cpuacct:cpu资源使用报告
cpuset:多处理器平台上的cpu集合
devices: 设备访问
freezer:挂起或恢复任务
memeory:内存用量及报告
perf_event:对cgroup中的任务进行统一性能测
net_cls:cgroup中的任务创建的数据报文的类别

 

 

 镜像:静态

 容器:动态的,有生命周期

 

安装docker
依赖环境:

  • 64bits cpu
  • linux kernel 3.10+
  • linux kernel cgroups and namespaces

最好是安装在centos7,因为yum的仓库docker版本比较老,直接使用清华大学的镜像
配置yum源:
  # wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
修改
  # sed -i 's@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce@g' docker-ce.repo

安装
  # yum install docker-ce

docker配置文件

 mkdir /etc/docker    #默认不存在,需要自己创建
 vim /etc/docker/daemon.json   

定义镜像加速器:

  可以使用docker cn/阿里云加速器/中国科技大学加速器

{
"registry-mirrors": ["https://registry.docker-cn.com"]
}

 

Daemon:
# systemctl start docker
# docker version   #查看docker client和server 的version信息

# docker --help

docker 对象有images,containers,networks,volumes,plugin等对象,都可以执行增删改查操作。

 # docker container --help 

# docker info #查看docker详细信息

 

镜像
# docker search nginx

   alpine:(微型发行版,小镜像,提供基础环境,不带调试工具,不建议用在生产环境)

# docker [image] pull

# docker inspect 1e1148e4cc2c #查看镜像的详细信息

容器
docker container ls  # 列出正在运行的容器
docker container ls -a  # 列出所有容器,包括停止运行的

docker ps   等同于docker container ls 

 docker [container] run
 docker container stop 9a34a9f0e7d2
 docker container rm 9a34a9f0e7d2

运行容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

  • -t (tty)  让docker分配一个伪终端

  • -i   交互式访问
  • --name  容器名称
  • --network  容器网络,默认bridge。 通过docker network ls 可以查看到
  • -d  运行在后台

运行一个容器:

 # docker run -d --name web1 nginx:1.14-alpine

 # docker run --name b1 -it busybox
 / # ls
 bin dev etc home proc root sys tmp usr var

 / # httpd --help

 / # mkdir /data/html -p
 / # vi /data/html/index.html

 / # httpd -f -h /data/html/   运行httpd

 在容器外部可以访问该httpd服务,打开另一个终端:

# docker inspect b1  查看容器信息,容器ip

# curl  172.17.0.2

 

docker ps -a (docker container ls -a) 查看所有容器

启动已停止的容器

docker start [OPTIONS] CONTAINER [CONTAINER...]

Start one or more stopped containers

Options:
-a, --attach Attach STDOUT/STDERR and forward signals
--detach-keys string Override the key sequence for detaching a container
-i, --interactive Attach container's STDIN

# docker start -a -i b1  重新启动b1容器

停止容器

docker stop 

docker kill 

删除容器

docker rm b1

进入一个后台启动的容器中:

docker attach container_name/container_id

 

在容器中执行命令

docker container exec -it web1 /bin/sh

/ # ps
PID USER TIME COMMAND
1 root 0:00 nginx: master process nginx -g daemon off;
6 nginx 0:00 nginx: worker process
17 root 0:00 /bin/sh
23 root 0:00 ps

查看容器日志

docker container logs 63e704e720fa

 

 

 

Docker Images

docker镜像中含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动容器。 

  • 采用分层构建机制,最底层为bootfs,上面是rootfs
    • bootfs:  用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节约内存资源
    • rootfs:位于bootfs之上,表现为docker容器的根文件系统;

      传统模式中,系统启动时,内核挂载rootfs时会首先将其挂载为只读模式,完整性自检完成后将其重新挂载为读写模式
      docker中,rootfs由内核挂载为“只读”模式,而后通过联合“挂载技术”额外挂载一个“读写层”。

            

 

dockers image layer

  • 位于下层的镜像为父镜像(parent image),最底层的为基础镜像
  • 最上层为“可读写”层,其下的均为“只读”层,如果容器被删除,最上层的读写层会一并被删除

docker 分层镜像

docker分层镜像,除了aufs,还支持btrfs,devicemapper,overlay2和vfs等

 

Docker Registry

启动容器时,docker daemon 会试图从本地获取相关镜像,本地镜像不存在时,会从Registry中下载镜像并保存到本地。

Registry用于保存docker镜像,包括镜像的层次结构和元数据

分类:

  • Sponsor Registry:第三方的registry,供客户和docker社区使用
  • Mirror Registry:第三方的registry,只让客户使用
  • Vendor Registry:由发布docker镜像的供应商提供的registry
  • Private Registry:通过设有防火墙和额外的安全层的私有实体提供的registry

Registry(repository and index)

Repository  

  • 由某特定的docker镜像的所有迭代版本组成的镜像仓库
  • 一个Registry可以存在多个Repository
    • Repository可分为“顶层仓库”和“用户仓库”
    • 用户仓库名称格式为“用户名/仓库名”
  • 每个仓库可以包含多个Tag(标签),每个标签对应一个镜像。一个镜像可以有多个tag,一个tag只能属于一个镜像

Index

  • 维护用户账户、镜像的校验以及公共命名空间的信息
  • 相当于为registry提供了一个完成用户认证等功能的检索接口

docker registry中的镜像通常由开发人员制作,而后推送至“公共”或“私有”registry上保存,公其它人员使用,例如部署到生产环境

 

 

镜像的生成途径

  • Dockerfile    build
  • 基于容器制作   commit
  • Docker Hub automated builds

基于容器制作镜像

  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

  Options:

  -a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
  -c, --change list Apply Dockerfile instruction to the created image    改变dockerfile指令
  -m, --message string Commit message
  -p, --pause Pause container during commit (default true)

 例如:

docker run --name b1 -it busybox   (启动一个容器)
/ # mkdir /data/html -p
/ # vi /data/html/index.html

 

基于容器创建镜像

docker commit -p b1    
sha256:ae437fa992d9c8182cffcf60e382f8d15a44e26065871b447e2838421b9231a1

docker image ls

REPOSITORY   TAG          IMAGE ID         CREATED          SIZE
<none>           <none>     ae437fa992d9   3 seconds ago  1.2MB

 给镜像打标签

 docker tag ae437fa992d9 abao/bbox:v0.1

docker image ls
REPOSITORY   TAG    IMAGE ID          CREATED        SIZE
abao/bbox       v0.1    ae437fa992d9   5 minutes ago 1.2MB

一个镜像可以打多个标签:

docker tag abao/bbox:v0.1 abao/bbox:latest

镜像创建完成后,启动容器查看

docker run --name t1 -it abao/bbox:latest
/ # ls
bin data dev etc home proc root sys tmp usr var
/ # cat data/html/index.html 

查看镜像详细信息

busybox container t1可以看到t1这个镜像的详细信息  

"Cmd": [  #默认执行的指令,通过构建镜像时的-c可以更改
"sh"
],

docker commit -a "abao <abao@test.com>" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p b1 abao/bbox:v0.2

 

启动镜像

docker run --name t2 abao/bbox:v0.2

可以查看到

docker ps 

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea4d55c5ad60 abao/bbox:v0.2 "/bin/httpd -f -h /d…" About a minute ago Up About a minute t2

也可以通过curl访问到

 

docker push

docker login 先

docker push  (如果不是push到docker hub,必须先打tag,tag包含服务器地址/名称空间/仓库名称:标签)

 

镜像的导入和导出

 

主机1: 

docker save -o myimages.gz  abao/bbox:v0.1 abao/bbox:v0.2  

主机2:

docker load -i myimages.gz  

 

posted @ 2020-02-27 10:29  卡布爱学习  阅读(266)  评论(0编辑  收藏  举报