Docker基础命令入门
1. 引言
Docker是一个虚拟环境容器,可以将开发环境、代码、配置文件等一并打包到容器中,在Mac、Linux、Windows中发布,在开发中,经常会遇到配置环境的问题,Docker相比于虚拟机更轻巧快速,它的可移植性和轻量级的特性,还可以使得我们轻松的完成动态管理的工作负担,并根据业务指标需求,实施扩展或拆除应用程序和服务。
Docker的三个基本概念:
1.镜像(Image):
Docker的镜像概念类似于虚拟机中的镜像,是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。
2.容器(Container):
容器是由Docker镜像创建的一个实例,可以看做是一个轻量级的沙盒。Docker引擎用来利用容器来运行、隔离各个应用,可以创建、启动、停止、删除容器,各个容器之间是相互隔离的,互不影响。
3.仓库(Repository):
类似于GitHub,用于托管镜像,仓库中有个人上传镜像和官方镜像。
在<京西商城>项目中,我曾经遇到过celery
、rabbitMQ
和fastDFS
三个工具的部署工作,部署时踩坑颇多,集中记录一下Docker命令和心得。
2. Docker的安装(macOS)
从Docker官方网站下载对应版本的客户端,macOS客户端包含GUI,我们安装好后就能直接发现Docker已经运行成功。
此时,Docker页面显示如图:
可以从页面中但看Docker已经运行,且本地已经含有3个image镜像。
我们打开终端,并输入sudo docker --version
判断安装是否成功。
安装完成,我们的Docker已经默认启动了服务。
# 启动docker
sudo service docker start
# 重启docker
sudo service docker restart
# 停止docker
sudo service docker stop
3. Docker的镜像操作
3.1 镜像列表
GraydeMBP:~ gray$ sudo docker image ls
Password:
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu5_tmp latest a222e57e76f7 About an hour ago 63.3MB
ubuntu 18.04 2c047404e52d 3 weeks ago 63.3MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
GraydeMBP:~ gray$
* REPOSITORY:镜像所在的仓库名称
* TAG:镜像标签
* IMAGEID:镜像ID
* CREATED:镜像的创建日期(不是获取该镜像的日期)
* SIZE:镜像大小
3.2 从仓库拉取镜像
# 官方镜像
$ sudo docker image pull 镜像名称 或者 sudo docker image pull library/镜像名称
$ sudo docker image pull ubuntu 或者 sudo docker image pull library/ubuntu
$ sudo docker image pull ubuntu:16.04 或者 sudo docker image pull library/ubuntu:16.04
# 个人镜像
$ sudo docker image pull 仓库名称/镜像名称
$ sudo docker image pull itcast/fastdfs
GraydeMBP:~ gray$ sudo docker image pull ubuntu:16.04
16.04: Pulling from library/ubuntu
be8ec4e48d7f: Downloading
33b8b485aff0: Downloading
d887158cc58c: Downloading
05895bb28c18: Downloading
16.04: Pulling from library/ubuntu
be8ec4e48d7f: Pull complete
33b8b485aff0: Pull complete
d887158cc58c: Pull complete
05895bb28c18: Pull complete
Digest: sha256:3355b6e4ba1b12071ba5fe9742042a2f10b257c908fbdfac81912a16eb463879
Status: Downloaded newer image for ubuntu:16.04
docker.io/library/ubuntu:16.04
GraydeMBP:~ gray$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu5_tmp latest a222e57e76f7 About an hour ago 63.3MB
ubuntu 16.04 9499db781771 3 weeks ago 131MB
ubuntu 18.04 2c047404e52d 3 weeks ago 63.3MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
3.3 删除镜像
$ sudo docker image rm 镜像名或镜像ID
$ sudo docker image rm ubuntu5_tmp
$ sudo docker image rm a222e57e76f7
GraydeMBP:~ gray$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu5_tmp latest a222e57e76f7 About an hour ago 63.3MB
ubuntu 16.04 9499db781771 3 weeks ago 131MB
ubuntu 18.04 2c047404e52d 3 weeks ago 63.3MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
GraydeMBP:~ gray$ sudo docker image rm ubuntu5_tmp
Untagged: ubuntu5_tmp:latest
Deleted: sha256:a222e57e76f7ae347baa761ea64d3e64671793bc515809395e88d3fbeda0d0a1
GraydeMBP:~ gray$ sudo docker image ls #其中的ubuntu5_tmp已经被删除
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 9499db781771 3 weeks ago 131MB
ubuntu 18.04 2c047404e52d 3 weeks ago 63.3MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
4. Docker容器操作
4.1 容器列表
# 查看正在运行的容器
$ sudo docker container ls
# 查看所有的容器
$ sudo docker container ls --all
GraydeMBP:~ gray$ sudo docker container ls # 查看正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2e03b572e28 ubuntu:18.04 "/bin/bash" About an hour ago Up About an hour ubuntu5
GraydeMBP:~ gray$ sudo docker container ls --all # 查看所有的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2e03b572e28 ubuntu:18.04 "/bin/bash" About an hour ago Up About an hour ubuntu5
cbe9d8146990 ubuntu:18.04 "/bin/bash" 2 hours ago Exited (0) 2 hours ago ubuntu4
a49265632b2b ubuntu:18.04 "/bin/bash" 2 hours ago Exited (0) 2 hours ago ubuntu3
68b3d9bc93bb ubuntu:18.04 "/bin/bash" 2 hours ago Exited (0) 2 hours ago ubuntu2
77aac4d3503e ubuntu:18.04 "/bin/bash" 2 hours ago Exited (100) 2 hours ago ubuntu1
89d83406afdd hello-world "/hello" 2 hours ago Exited (0) 2 hours ago goofy_driscoll
4.2 创建容器
$ sudo docker run [option] 镜像名 [向启动容器中传入的命令]
常用可选参数说明:
* -i 表示以《交互模式》运行容器。
* -t 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
* --name 为创建的容器命名。
* -v 表示目录映射关系,即宿主机目录:容器中目录。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
* -d 会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)。
* -p 表示端口映射,即宿主机端口:容器中端口。
* --network=host 表示将主机的网络环境映射到容器中,使容器的网络与主机相同。
4.2.1 交互式容器
$ sudo docker run -it --name=ubuntu6 ubuntu:18.04 /bin/bash
# 在容器中可以随意执行linux命令,就是一个ubuntu的环境。
# 当执行 exit 命令退出时,该容器随之停止。
4.2.2 守护式容器
# 开启守护式容器
$ sudo docker run -dit --name=ubuntu7 ubuntu:18.04
GraydeMBP:~ gray$ sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2e03b572e28 ubuntu:18.04 "/bin/bash" 2 hours ago Up 2 hours ubuntu5
GraydeMBP:~ gray$ sudo docker run -dit --name=ubuntu7 ubuntu:18.04
aef676148140c247bb0052da4e0390f81ba184512d53c3d2bc6c014a6eb02702
GraydeMBP:~ gray$ sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aef676148140 ubuntu:18.04 "/bin/bash" 9 seconds ago Up 9 seconds ubuntu7
f2e03b572e28 ubuntu:18.04 "/bin/bash" 2 hours ago Up 2 hours ubuntu5
# 进入到容器内部交互环境
$ sudo docker exec -it 容器名或容器id 进入后执行的第一个命令
$ sudo docker exec -it ubuntu2 /bin/bash
GraydeMBP:~ gray$ sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aef676148140 ubuntu:18.04 "/bin/bash" 9 seconds ago Up 9 seconds ubuntu7
f2e03b572e28 ubuntu:18.04 "/bin/bash" 2 hours ago Up 2 hours ubuntu5
GraydeMBP:~ gray$ sudo docker exec -it ubuntu7 /bin/bash
Password:
root@aef676148140:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@aef676148140:/# mkdir hello.txt
root@aef676148140:/# ls
bin boot dev etc hello.txt home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@aef676148140:/# exit
exit
GraydeMBP:~ gray$
# 如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。
# 在容器内部执行 exit 命令退出时,该容器也随之停止。
4.3 停止和启动容器
# 停止容器
$ sudo docker container stop 容器名或容器id
# kill掉容器
$ sudo docker container kill 容器名或容器id
# 启动容器
$ sudo docker container start 容器名或容器id
4.4 删除容器
注意:正在运行的容器无法删除,必须先停止容器,如果无法停止也可以kill掉容器
$ sudo docker container rm 容器名或容器id
4.5 容器制成镜像
为了将配置完成的环境可以重复利用,或分享,我们可以将容器制作成镜像。
# 将容器制作成镜像
$ sudo docker commit 容器名 镜像名
# 镜像打包备份
$ sudo docker save -o (位置)+保存的文件名 镜像名 # (省略则默认根目录)
GraydeMBP:~ gray$ sudo docker container ls
Password:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aef676148140 ubuntu:18.04 "/bin/bash" About an hour ago Up About an hour ubuntu7
f2e03b572e28 ubuntu:18.04 "/bin/bash" 3 hours ago Up 3 hours ubuntu5
GraydeMBP:~ gray$ sudo docker commit ubuntu7 ubuntu7_tmp
sha256:bc54a3828a4fe916c3f7935e6a41742e58d6603efde03e9a37bda1b6535b375e
GraydeMBP:~ gray$ sudo docker save -o ubuntu7_tmp.tar ubuntu7_tmp
GraydeMBP:~ gray$ ls
Applications Downloads Parallels fsdownload
Desktop Movies Public ubuntu7_tmp.tar
假如我们需要将别人打包好的备份导入该如何操作呢?
# 镜像解压
$ sudo docker load -i 文件路径/备份文件
GraydeMBP:django-study gray$ ls
bookmanager fastdfs_docker.tar ubuntu5_tmp.tar
GraydeMBP:django-study gray$ sudo docker load -i fastdfs_docker.tar
Password:
43e653f84b79: Loading layer [==================================================>] 207.2MB/207.2MB
b53d7889c283: Loading layer [==================================================>] 239.4MB/239.4MB
173e7c0101b8: Loading layer [==================================================>] 4.096kB/4.096kB
86bb2d38a7fd: Loading layer [==================================================>] 1.97MB/1.97MB
c964e799140e: Loading layer [==================================================>] 6.117MB/6.117MB
33e47575beac: Loading layer [==================================================>] 2.56kB/2.56kB
d98fa29adb07: Loading layer [==================================================>] 7.103MB/7.103MB
faa1ac83b5e3: Loading layer [==================================================>] 25.09kB/25.09kB
962bf3b9c052: Loading layer [==================================================>] 93.18kB/93.18kB
b4d8646fb534: Loading layer [==================================================>] 16.06MB/16.06MB
7c4117be0eb5: Loading layer [==================================================>] 59.9kB/59.9kB
cb1d1ef69510: Loading layer [==================================================>] 5.632kB/5.632kB
ea8af36b7729: Loading layer [==================================================>] 5.12kB/5.12kB
882cf81bf175: Loading layer [==================================================>] 5.12kB/5.12kB
Loaded image: delron/fastdfs:latest
GraydeMBP:django-study gray$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu7_tmp latest bc54a3828a4f 8 minutes ago 63.3MB
ubuntu 16.04 9499db781771 3 weeks ago 131MB
ubuntu 18.04 2c047404e52d 3 weeks ago 63.3MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
delron/fastdfs latest 8487e86fc6ee 2 years ago 464MB
# 最后一行就是我们之前提到的fastDFS 备份文件
4.6 本地映射(以fastDFS为例)
1.获取镜像
# 从仓库拉取镜像
$ sudo docker image pull delron/fastdfs
# 解压教学资料中本地镜像
$ sudo docker load -i 文件路径/fastdfs_docker.tar
GraydeMBP:~ gray$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 9499db781771 4 weeks ago 131MB
ubuntu 18.04 2c047404e52d 4 weeks ago 63.3MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
delron/fastdfs latest 8487e86fc6ee 2 years ago 464MB
现在,我们开启tracker容器,并将tracker运行目录映射到宿主机/var/fdfs/tracker
本地目录中
$ sudo docker run -dit --name tracker --network=host -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker
GraydeMBP:django-study gray$ ls
bookmanager fastdfs_docker.tar ubuntu5_tmp.tar
GraydeMBP:django-study gray$ sudo docker run -dit --name tracker --network=host -v /Users/gray/Desktop/django-study/fdfs/tracker:/var/fdfs delron/fastdfs tracker
4ec8ccbd5fd58d2373cc85b3fc81423a3fea6774d9e0f0642ec275769363c933
GraydeMBP:django-study gray$ sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4ec8ccbd5fd5 delron/fastdfs "/usr/bin/start1.sh …" 14 seconds ago Up 13 seconds tracker
GraydeMBP:django-study gray$ ls
bookmanager fastdfs_docker.tar fdfs ubuntu5_tmp.tar
# 可以看到fastDfs文件夹已经挂载
3.现在,我们开启storage容器,TRACKER_STORAGE=Tracker的IP地址:22122
,再将storage运行目录映射到宿主机/var/fdfs/storage
本地目录中
$ sudo docker run -dti --name storage --network=host -e TRACKER_SERVER=192.168.123.227:22122 -v /Users/gray/Desktop/django-study/fdfs/storage:/var/fdfs delron/fastdfs storage
GraydeMBP:tracker gray$ sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4ec8ccbd5fd5 delron/fastdfs "/usr/bin/start1.sh …" 17 minutes ago Up 17 minutes tracker
GraydeMBP:tracker gray$ sudo docker run -dti --name storage --network=host -e TRACKER_SERVER=192.168.123.227:22122 -v /Users/gray/Desktop/django-study/fdfs/storage:/var/fdfs delron/fastdfs storage
70b26b6e08ca5e5a869ebe2f41f3de910513a9ff5769c9ead46572d4a2f88dc9
GraydeMBP:tracker gray$ sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
70b26b6e08ca delron/fastdfs "/usr/bin/start1.sh …" About a minute ago Up About a minute storage
4ec8ccbd5fd5 delron/fastdfs "/usr/bin/start1.sh …" 21 minutes ago Up 21 minutes tracker
GraydeMBP:fdfs gray$ ls
storage tracker
博文的后续更新,请关注我的个人博客:星尘博客