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
(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基本命令已经讲完了,是不是觉得很简单。