Docker 镜像和容器管理

20分钟时间,大家可以快速掌握Docker相关知识,首先得了解几个概念。其实Docker和我们之前接触的Virtual Box、VMWare、QEMU类似,只是Docker是简单的进程级隔离管理方法。其中包括容器及镜像两个常用的概念,可以认为docker就是一个管理平台,container就是一个虚拟机,镜像是一个当前虚拟机的快照,container里面可以跑操作系统。多个容器里面可以用同一个镜像生成。这么类比的话,大家可能更容易理解一点。下面简单基于Mac上的docker简单介绍一下相关的命令,其他系统命令都一样。

1. 先在mac上安装docker,用命令行安装即可,很简单:

brew cask install docker

会提示你输入密码,如果你之前安装过要重新安装,可以用:

brew cask reinstall docker

安装好之后会在你Mac的启动台有个图标,点击启动之后才能命令行里使用docker相关命令,不然命令行提示找不到。或者启动服务:

systemctl start docker.service

2. 拉取Centos镜像

这里我们拉centos7.5.1804作为例子,你可以修改冒号后的版本号拉去你想要的版本

docker pull <System Name>:<Version Number>

这里要注意一下,拉去镜像的时候可能拉不到,这是因为被强了,你得搞个外网的proxy。

拉取的信息输出:

(base) ➜  ~ docker pull centos:7.5.1804
7.5.1804: Pulling from library/centos
5ad559c5ae16: Pull complete
Digest: sha256:7a45e4a1efbaafc1d9aa89925b6fdb33288a96d35ea0581412316e2f0ad3720a
Status: Downloaded newer image for centos:7.5.1804
docker.io/library/centos:7.5.1804

3. 查看拉取得镜像

docker images

输出结果如下,记着我们的IMAGE ID

扫描二维码关注公众号,回复: 8624153 查看本文章

(base) ➜  ~ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7.5.1804            cf49811e3cdb        6 months ago        200MB

4. 加载镜像到docker

docker run -it <Image ID> /bin/bash

cf498是IMAGE ID的前5位,这里只需要输入能区分其他IMAGE的前几位就可以了。不需要全部输入。

之后你就登陆到docker上了,这个时候,会同时创建一个docker容器,就是Container。

让我来查看下centos上的版本信息是否和我们拉取的一致吧。

登录信息如下,root后面@的部分就是你的Container ID(容器ID)

(base) ➜  ~ docker run -it cf498 /bin/bash
[root@58ed746e59f8 /]#

5. 查看版本信息

查看版本信息如下:

[root@58ed746e59f8 /]# cat /proc/version
Linux version 4.9.184-linuxkit (root@a8c33e955a82) (gcc version 8.3.0 (Alpine 8.3.0) ) #1 SMP Tue Jul 2 22:58:16 UTC 2019
[root@58ed746e59f8 /]# uname -a
Linux 58ed746e59f8 4.9.184-linuxkit #1 SMP Tue Jul 2 22:58:16 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@58ed746e59f8 /]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

6. 退出容器

可以用Ctrl+d或者在docker命令行输入exit,即可退出容器,但是对于attach登上来的,可能会停止容器。如果想退出时,容器依然在,可以用Ctrl+p+q。

7. 查看当前容器的状态

 docker ps -a

(base) ➜  ~ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
58ed746e59f8        cf498               "/bin/bash"         12 minutes ago      Exited (0) About a minute ago                       clever_kepler

这里容器status 已经变成退出了。

8. 再次进入容器

建议用exec,不要用attach,用attach进入的话,退出用Ctrl+D或者exit命令会终止容器,但是用exec登录就不会停止容器。

docker exec -it <Container ID> /bin/bash
docker attach <Container ID>

当容器退出的时候,你再次用exec或者attach进入容器就会报错。

base) ➜  ~ docker exec -it 58ed746e59f8 /bin/bash
Error response from daemon: Container 58ed746e59f890c3f0c431e5cc253e1af3aa58bf6d88e9ebe345177d2723b0e0 is not running

(base) ➜  ~ docker attach 58ed746e59f8
You cannot attach to a stopped container, start it first

这个时候有两种方,第一种方法,采用第四步的加载镜像,但是这个时候会重新创建一个容器,这并不是我们想要的

(base) ➜  ~ docker run -it cf498 /bin/bash
[root@3336e7dba13c /]# exit
(base) ➜  ~ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
3336e7dba13c        cf498               "/bin/bash"         52 seconds ago      Exited (0) 6 seconds ago                       flamboyant_lewin
58ed746e59f8        cf498               "/bin/bash"         20 minutes ago      Exited (0) 9 minutes ago                       clever_kepler

第二种方法start之前的container,然后再exec上去。

9. 重启container

docker start <Container ID>

(base) ➜  ~ docker start 3336e7dba13c
3336e7dba13c
(base) ➜  ~ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
3336e7dba13c        cf498               "/bin/bash"         4 minutes ago       Up 4 seconds                                    flamboyant_lewin
58ed746e59f8        cf498               "/bin/bash"         24 minutes ago      Exited (0) 13 minutes ago                       clever_kepler

再用docker exec就可以登录激活状态的container了。

(base) ➜  ~ docker exec -it 3336e7dba13c /bin/bash
[root@3336e7dba13c /]# exit
(base) ➜  ~ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
3336e7dba13c        cf498               "/bin/bash"         6 minutes ago       Up 2 minutes                                    flamboyant_lewin
58ed746e59f8        cf498               "/bin/bash"         26 minutes ago      Exited (0) 15 minutes ago                       clever_kepler

再次从container里面退出,之前的docker也一直处于活跃状态。那这个时候想停掉活跃的container,怎么办呢?可以用stop命令。

10. 停止container

docker stop <Container ID>

停止镜像需要一会时间,大家耐心等一下。结果如下:

(base) ➜  ~   docker stop 3336e7dba13c
3336e7dba13c
(base) ➜  ~ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
3336e7dba13c        cf498               "/bin/bash"         9 minutes ago       Exited (137) 48 seconds ago                       flamboyant_lewin
58ed746e59f8        cf498               "/bin/bash"         29 minutes ago      Exited (0) 19 minutes ago

11. 保存容器内容为镜像

docker commit <Container ID>

我们先启动3336e7dba13c这个容器,然后做一个镜像

(base) ➜  ~ docker commit 3336e7dba13c
sha256:3b7a68bf880b0a7ca2c2459a37ff5562efbb2540ea7939d446a32a5acdef937e
(base) ➜  ~ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              3b7a68bf880b        6 seconds ago       200MB
centos              7.5.1804            cf49811e3cdb        6 months ago        200MB

我们发现新的IMAGE被打好了,但是REPOSITORY和TAG是none,这让我们后面很难区分,这个时候,可以用tag来标记docker镜像。

docker tag <Image ID> <New Tag Name>

其中ID就是对应的IMAGEID, 后面centos1是对应的REPOSITORY的名字。

(base) ➜  ~ docker tag 3b7a68bf880b centos1
(base) ➜  ~ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
centos1             latest              3b7a68bf880b        About a minute ago   200MB
centos              7.5.1804            cf49811e3cdb        6 months ago         200MB

12. 删除容器

docker rm <Container ID>

这里要注意不能删除正在活跃的容器,不然会报错

(base) ➜  ~ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
3336e7dba13c        cf498               "/bin/bash"         19 minutes ago      Up 5 minutes                                    flamboyant_lewin
58ed746e59f8        cf498               "/bin/bash"         39 minutes ago      Exited (0) 28 minutes ago                       clever_kepler
(base) ➜  ~ docker rm 3336e7dba13c
Error response from daemon: You cannot remove a running container 3336e7dba13c58df693233bcea09a05b28d311dc6e3fbd8f66eed1e894aae9e2. Stop the container before attempting removal or force remove

我们可以尝试删除之前那个停掉的容器58ed746e59f8,或者用stop容器3336e7dba13c停掉之后再删除。

(base) ➜  ~ docker rm 58ed746e59f8
58ed746e59f8
(base) ➜  ~ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3336e7dba13c        cf498               "/bin/bash"         23 minutes ago      Up 9 minutes                            flamboyant_lewin

发现删完了之后,就剩下那个活跃的容器了

13 删除镜像

docker rmi <Image ID>

我们尝试删除刚上面生成的镜像:3b7a68bf880b

(base) ➜  ~ docker rmi 3b7a68bf880b
Untagged: centos1:latest
Deleted: sha256:3b7a68bf880b0a7ca2c2459a37ff5562efbb2540ea7939d446a32a5acdef937e
(base) ➜  ~ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7.5.1804            cf49811e3cdb        6 months ago        200MB

到此docker基本命令已经讲完了,是不是觉得很简单。

发布了83 篇原创文章 · 获赞 18 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/lwc5411117/article/details/100972243