解释
registry:综合管理维护镜像组件,不仅仅保存docker镜像,还有镜像层次结构和元数据,一个registry里面包含多个仓库,一个仓库里面包含多个镜像 repository:具有某个功能的镜像的所有相关版本构成的集合 index:想像成是registry的索引,管理用户的账号,访问权限,镜像及镜像标签等信息 graph:从registry中下载的docker镜像需要保存在本地,此功能即由graph完成 /var/lib/docker/graph
下面是通过一些示例来进行命令说明
容器:独立运行的一个或一组应用,以及他们的运行环境
命令:run kill stop start restart
stop 关机
kill 拔电
启动方法:
通过镜像创建一个新的容器,run
启动一个处于停止状态的容器:start
下面这个图比较详细的说明了images,container,registry,dockerfile,backup等之间的关系
run执行步骤:
检查本地是否存在指定的镜像,不存在则从registry下载 利用镜像启动容器 分配一个文件系统,并在只读的镜像层外挂载一个可读层,docker commit是commit这个层的变化 从宿主机配置的网桥接口中桥接一个虚拟接口给此容器,默认是docker0 从地址池中分配一个地址给容器 执行用户指定的用户程序 程序执行完成后即终止
Docker 不是虚拟机,容器中的应用都应该以前台执行,而不是像虚拟机、物理机里面那样,用upstart/systemd 启动后台服务,容器内没有后台服务的概念
对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其它辅助进程不是它需要关心的东西。而使用service nginx start命令,则是希望 upstart 来以后台守护进程形式启动nginx服务。而刚才说了CMD service nginx start 会被理解为 CMD ["sh", "-c", "service nginx start"],因此主进程实际上是sh。那么当service nginx start 命令结束后,sh 也就结束了,sh作为主进程退出
了,自然就会令容器退出。
正确的做法是直接执行 nginx 可执行文件,并且要求以前台形式运行
让容器已deamon方式运行,运行容器的时候,使用-d选项
1、启动容器
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container --add-host list Add a custom host-to-IP mapping (host:ip),添加hosts静态解析,可在容器配置文件中查看到 -d, --detach Run container in background and print container ID,以daemon方式运行容器 --expose list Expose a port or a range of ports,暴露出哪个端口 -h, --hostname string Container host name,容器的主机名 -i, --interactive Keep STDIN open even if not attached,即使分离容器,也将标准输入处于打开状态 --ip string IPv4 address (e.g., 172.30.100.104),设置容器的主机名 --rm Automatically remove the container when it exits,当容器停止的时候,自动删除该容器 --name string Assign a name to the container,容器的名字 --network string Connect a container to a network (default "default") -p, --publish list Publish a container's port(s) to the host,暴露容器的某个端口到主机的某个端口 -t, --tty Allocate a pseudo-TTY,打开一个伪终端 -v, --volume list Bind mount a volume,容器目录和主机目录对应关系 下面是一个综合的示例 [root@master ~]#docker run \ --add-host "docker.com:192.168.10.2" \ --add-host "andblog.cn:192.168.10.3" \ -d --hostname "andy" -it \ --rm --name "andy-docker" \ --network default -p 80:80 \ -v /data:/data centos:6.9 /bin/bash [root@master ~]#docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 23009849484f centos:6.9 "/bin/bash" 12 seconds ago Up 11 seconds 0.0.0.0:80->80/tcp andy-docker [root@andy /]# cat /etc/hosts 127.0.0.1 localhost 192.168.10.2 docker.com 192.168.10.3 andblog.cn 当2个docker正在运行的时候 /usr/bin/dockerd --registry-mirror=https://dp3mgmkf.mirror.aliyuncs.com \_ docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/con \_ docker-containerd-shim d06f5317fca827af31dbcf3a84fdd96a37a8df78ba9b16f314595fed4cfca471 /var/run/docker/libcontainerd/d06f5317fca827af31dbcf3a84fdd96a37a8df78ba9b | \_ /bin/bash \_ docker-containerd-shim 141f9d43c37539aeab828b6cda6d4f875c9e749380d855d13eb61d09bfb108ec /var/run/docker/libcontainerd/141f9d43c37539aeab828b6cda6d4f875c9e749380d8 \_ /bin/bash
当启动的容器不用登录的时候
docker run busybox:latest /bin/echo "hello" 就可以,执行完成后容器处于停止状态
示例:因为没有启用交互式模式,镜像启动为容器,容器运行完命令后就会停止,相当于虚拟机关机,在ps命令中可以看到工作状态的容器,加上选项-a后可以看到所有的容器,包括关机的和正在运行的
[root@localhost ~]#docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest a8493f5f50ff 10 hours ago 192.5 MB busybox latest 00f017a8c2a6 4 weeks ago 1.11 MB [root@localhost ~]#docker run busybox:latest /bin/echo "hello" hello [root@localhost ~]#docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@localhost ~]#docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 688ace2a9e96 busybox:latest "/bin/echo hello" 15 seconds ago Exited (0) 14 seconds ago backstabbing_lamarr
–net=default Connect a container to a network
关联到哪个桥上面,默认是桥接到docker0上面
当重启防火墙的时候,需要重启docker服务,不然iptables上面的规则会清除
容器起名字
[root@localhost ~]#docker help run --name Assign a name to the container #为容器指派一个名字,以后启动停止,删除就可以使用这个名字来登录
示例:运行一个镜像为另外一个容器,以交互式模式运行,并指定名字为andy,结束容器后,可以看到ps命令里面有两个结束的容器,一个名字叫做andy。这样启动或者停止容器都可以使用这个名字来代替前面的id好,便于识别
对于交互式模式启动的容器,终止可以使用exit或者ctrl+d 组合键
#终端1 [root@localhost ~]#docker run -it --name andy centos:latest /bin/bash [root@be97a351d184 /]# #终端2 [root@bogon ~]#docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES be97a351d184 centos:latest "/bin/bash" 6 seconds ago Up 5 seconds andy [root@bogon ~]#docker stop andy andy [root@bogon ~]#docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@bogon ~]#docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES be97a351d184 centos:latest "/bin/bash" 2 minutes ago Exited (137) 2 minutes ago andy #终端1 [root@be97a351d184 /]# [root@localhost ~]#
docker stop:将正在运行的docker进程停止掉,即相当于虚拟机关机
#终端1 [root@localhost ~]#docker run -it centos:latest /bin/bash [root@937c911bc907 /]# #终端2 [root@bogon ~]#docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 937c911bc907 centos:latest "/bin/bash" 36 seconds ago Up 35 seconds berserk_meninsky [root@bogon ~]#docker stop 937c911bc907 937c911bc907 [root@bogon ~]#docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@bogon ~]#docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 937c911bc907 centos:latest "/bin/bash" 4 minutes ago Exited (137) 8 seconds ago berserk_meninsky #终端1 [root@937c911bc907 /]# hostname 937c911bc907 [root@937c911bc907 /]# [root@localhost ~]#
docker kill:将正在运行的容器关闭掉,和上面的stop的效果是一样的,但是比较粗暴,即相当于虚拟机拔电源来关机,可以看到关闭的container是两个
#终端1 [root@localhost ~]#docker run -it centos:latest /bin/bash [root@937c911bc907 /]# #终端2 [root@bogon ~]#docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9d8cde3d016a centos:latest "/bin/bash" 5 seconds ago Up 4 seconds happy_bohr [root@bogon ~]#docker kill 9d8cde3d016a 9d8cde3d016a [root@bogon ~]#docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@bogon ~]#docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9d8cde3d016a centos:latest "/bin/bash" 37 seconds ago Exited (137) 8 seconds ago happy_bohr 937c911bc907 centos:latest "/bin/bash" 7 minutes ago Exited (137) 3 minutes ago berserk_meninsky #终端1 [root@9d8cde3d016a /]# [root@localhost ~]#
重新连入一个终止的容器
这里有一个已经停止的docker容器,即已经关机的虚拟机
[root@bogon ~]#docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@bogon ~]#docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES be97a351d184 centos:latest "/bin/bash" 9 minutes ago Exited (0) 12 seconds ago andy
如果想要连到这个停止的容器中,需要先将这个容器启动起来,使用start命令,start之后因为没有使用-it选项,这个容器运行在后台,使用下面命令连入到这个容器中
docker exec -it container_id bash
或者在start容器的时候使用-i选项可以直接连入到容器中,看到容器的id号是不变的
[root@be97a351d184 /]# exit exit [root@localhost ~]# [root@localhost ~]#docker start -it andy unknown shorthand flag: 't' in -t See 'docker start --help'. [root@localhost ~]#docker start -i andy [root@be97a351d184 /]# [root@be97a351d184 /]#
删除容器
删除容器前要先将容器停止
docker rm container_id
当容器在运行,强制删除
docker rm -f container_id
清除所有处于终止态的容器
docker rm $(docker ps -a -q)
–
–
–
评论前必须登录!
注册