路漫漫其修远兮
吾将上下而求索

docker学习:容器操作

解释

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等之间的关系

image.png

容器操作.zip

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)

未经允许不得转载:江哥架构师笔记 » docker学习:容器操作

分享到:更多 ()

评论 抢沙发

评论前必须登录!