简介
官网:https://www.docker.com/
文档:https://docs.docker.com/docker-for-windows/
命令:https://docs.docker.com/engine/reference/run/
仓库:https://hub.docker.com/
Docker 是一个开源的应用容器引擎。
Docker 的思想来自于集装箱,彼此之间隔离。
Docker 通过隔离机制,可以将服务器利用到极致。
Docker 容器完全使用沙箱机制,相互之间不会有任何接口。
基本命令
Docker 的帮助命令是一个万能命令,可以用来查看 Docker 的所有命令。
docker [命令] --help
查看镜像相关命令
[root@sail ~]# docker images --help
Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
List images
Options:
-a, --all Show all images (default hides intermediate images)
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet Only show image IDs
查看容器相关命令
[root@sail ~]# docker ps --help
Usage: docker ps [OPTIONS]
List containers
Options:
-a, --all Show all containers (default shows just running)
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print containers using a Go template
-n, --last int Show n last created containers (includes all states) (default -1)
-l, --latest Show the latest created container (includes all states)
--no-trunc Don't truncate output
-q, --quiet Only display container IDs
-s, --size Display total file sizes
查看 Docker 的基本信息。
[root@sail ~]# docker version
查看 Docker 的系统信息。
[root@sail ~]# docker info
镜像命令
查看所有本地主机上的镜像
# 该命令等价于 docker image ls
docker images [参数] [镜像[:标签]]
-a:显示所有镜像。
-q:只显示 ID。
# 显示所有镜像的 ID
docker images -aq
对镜像进行过滤
[root@sail ~]# docker images java
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@sail ~]# docker images hello-world
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 2 months ago 13.3kB
[root@sail ~]# docker images hello-world:latest
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 2 months ago 13.3kB
# 结果分析
REPOSITORY:镜像名(镜像仓库源)。
TAG:镜像的标签。
IMAGE ID:镜像的 ID。
CREATED:镜像的创建时间。
SIZE:镜像的大小。
搜索镜像
docker search [参数]
-f / --filter:根据过滤条件搜索。
# 搜索出 Stars 大于 3000 的
docker search mysql -f=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11789 [OK]
mariadb MariaDB Server is a high performing open sou… 4488 [OK]
拉取镜像
# 不输入参数默认拉取最新的
docker pull [参数] 镜像名[:标签]
-a:拉取镜像的所有标签。
-q:抑制详细输出。
[root@sail ~]# docker pull redis
Using default tag: latest # 默认最新版标签
latest: Pulling from library/redis
e5ae68f74026: Pull complete # 分层下载,docker image的核心:联合文件系统
37c4354629da: Pull complete
b065b1b1fa0f: Pull complete
6954d19bb2e5: Pull complete
6333f8baaf7c: Pull complete
f9772c8a44e7: Pull complete
Digest: sha256:2f502d27c3e9b54295f1c591b3970340d02f8a5824402c8179dcd20d4076b796 #防伪签名
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest # 真实地址,docker pull redis 等价于 docker pull docker.io/library/redis:latest
# 指定版本下载
docker pull redis:5.0
删除镜像
docker rmi [参数] 镜像 [镜像...]
-f:强制删除。
# 查看现存镜像
[root@sail ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis 5.0 071510791e92 5 days ago 110MB
redis latest aea9b698d7d1 6 days ago 113MB
mysql 5.7 738e7101490b 6 days ago 448MB
mysql latest bbf6571db497 6 days ago 516MB
hello-world latest feb5d9fea6a5 2 months ago 13.3kB
# 删除一个。可以通过名称,也可以指定 ID,-f 表示强制删除。
[root@sail ~]# docker rmi -f feb5d9fea6a5
# 删除多个。用空格分隔 ID。
[root@sail ~]# docker rmi -f 738e7101490b bbf6571db497
# 删除所有。先用 docker images -aq 查询出所有镜像,再使用 docker rmi -f 递归删除。
[root@sail ~]# docker rmi -f $(docker images -aq)
运行镜像
docker run [参数] 镜像名
--name:指定容器的名称,如果正在运行该名称的容器,会报错。
--rm:用完即删除,通常用来测试。
-d:后台方式运行。
-it:使用交互方式运行,可以进入容器查看内容。
-e:指定运行环境。
-p:随机指定端口。
-p:指定容器的端口,如:-p 8080:8080。还可以有以下写法:
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
[root@sail ~]# docker run -it centos /bin/bash
Unable to find image 'centos:latest' locally # 检索本地镜像,发现没有该镜像,则去仓库中搜索。
latest: Pulling from library/centos # 开始从仓库中拉取
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
[root@81c83ea42dc0 /]# ls # 由于是以交互方式运行,且进入 /bin/bash 中,此时的路径即为 centos 容器中的 /bin/bash
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
容器命令
查看容器
docker ps [参数]
-a:查看所有容器(包括正在运行的和已经停止的)。
-n:显示最近创建的容器,设置显示个数。
-q:只显示容器的编号。
# 查看正在运行的容器
[root@sail ~]# docker ps
# 查看所有容器
[root@sail ~]# docker ps -a
# 显示最近创建的 2 个容器
[root@sail ~]# docker ps -a -n=2
# 只显示容器的 ID
[root@sail ~]# docker ps -aq
退出容器
[root@sail ~]# docker run -it centos /bin/bash
[root@7ac04abd5a1f /]# exit
exit
[root@sail ~]#
[root@sail ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@sail ~]# docker run -it centos /bin/bash
[root@1aaf76d85b9e /]# [root@sail ~]# docker ps # 此时即为使用 Ctrl + P + Q 快捷键的效果
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1aaf76d85b9e centos "/bin/bash" 8 seconds ago Up 8 seconds intelligent_proskuriakova
删除容器
docker rm [参数] 容器 [容器...]
-f:强制删除。
# 删除指定容器(不能删除正在运行的容器)
[root@sail ~]# docker rm 1aaf76d85b9e
# 强制删除指定容器
[root@sail ~]# docker rm -f 1aaf76d85b9e
# 删除所有容器。先使用 docker ps -aq 获取所有容器的 ID,再调用 docker rm -f 递归删除。
[root@sail ~]# docker rm -f $(docker ps -aq)
# 删除所有容器。使用管道符 | 获取 Docker 相关的所有容器 ID 并使用 docker rm -f 删除。
[root@sail ~]# docker ps -a -q|xargs docker rm -f
容器运行命令
# 运行关闭的容器
[root@sail ~]# docker start 569026bc0955
# 停止容器
[root@sail ~]# docker stop 569026bc0955
# 重启容器
[root@sail ~]# docker restart 569026bc0955
# 杀掉容器
[root@sail ~]# docker kill 569026bc0955
常用命令
启动Docker
systemctl start docker
查看日志
docker logs [参数] 容器
-f:日志流动输出。
-t:展示时间戳。
--tail:从日志末尾显示的行数。
# 容器最后 10 条日志
[root@sail ~]# docker logs -f -t --tail 10 c3d59f55d600
后台启动
# 使用 docker run -d 启动,也并不能保证容器一定能在后台运行,如果没有前台使用,容器启动后发现自己没有提供服务,会立刻停止。
docker run -d 镜像
查看容器信息
# 不管容器是否运行,都可以使用该命令查看。
docker inspect 容器
进入正在运行的容器
docker exec [参数] 容器 路径
-d:后台运行。
-it:交互模式进入。
# 使用 docker exec 可以进入容器并开启一个新的终端,可以在里面操作。
# 这种进入方式是单独开了一个新进程的方式。
[root@sail ~]# docker exec -it 96ed3fe3e7f1 /bin/bash
[root@96ed3fe3e7f1 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@96ed3fe3e7f1 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Dec09 pts/0 00:00:00 /bin/bash
root 15 0 0 03:38 pts/1 00:00:00 /bin/bash
root 30 15 0 03:39 pts/1 00:00:00 ps -ef
# 这种进入方式没有开启新的进程(/bin/bash 是 centos 容器的默认终端)。
docker attach 容器
[root@sail ~]# docker attach 96ed3fe3e7f1
[root@96ed3fe3e7f1 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Dec09 pts/0 00:00:00 /bin/bash
root 33 1 0 05:49 pts/0 00:00:00 ps -ef
从容器内拷贝文件到主机
# 进入容器,创建一个文件
[root@sail ~]# docker attach 96ed3fe3e7f1
[root@96ed3fe3e7f1 /]# cd /home
[root@96ed3fe3e7f1 home]# touch test.java
[root@96ed3fe3e7f1 home]# ls
test.java
[root@96ed3fe3e7f1 home]# exit
exit
# 退出容器后,不管容器是否启动,都可以复制容器中的文件到主机上
[root@sail ~]# cd /home
[root@sail home]# docker cp 96ed3fe3e7f1:/home/test.java /home
[root@sail home]# ls
admin f2 f3 sail test.java
# 这种方式是一个手动过程,很不方便,推荐使用数据卷技术,可以实现自动同步主机和容器的目录。
查看Docker内存占用
docker stats [参数] [容器...]
-a:查看所有容器的内存占用(默认只展示运行的容器)。
[root@sail home]# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
96ed3fe3e7f1 centos01 0.00% 524KiB / 1.694GiB 0.03% 0B / 0B 0B / 0B 1
[root@sail home]# docker stats -a
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
0aee6f74b913 brave_rosalind 0.00% 0B / 0B 0.00% 0B / 0B 0B / 0B 0
c3d59f55d600 musing_poincare 0.00% 0B / 0B 0.00% 0B / 0B 0B / 0B 0
569026bc0955 centos03 0.00% 0B / 0B 0.00% 0B / 0B 0B / 0B 0
71a97b830ec5 centos02 0.00% 0B / 0B 0.00% 0B / 0B 0B / 0B 0
96ed3fe3e7f1 centos01 0.00% 524KiB / 1.694GiB 0.03% 0B / 0B 0B / 0B 1
部署nginx
# 下载镜像
docker pull nginx
# 查看镜像
docker images
# 运行镜像
docker run -d --name=nginx01 -p 3344:80 nginx
# 查看正在运行的容器
docker ps
# 测试 外网可以访问
curl localhost:3344
# 查看容器中 Nginx 目录
docker exec -it nginx01 /bin/bash
部署tomcat
# 后台启动tomcat
docker run -d -p 8080:8080 --name=tomcat01 tomcat
# 查看正在运行的容器
docker ps
# 进入容器
docker exec -it tomcat01 /bin/bash
# 进入 webapps
# 这里发现一个问题,Tomcat 下的 webapps 没有文件,所以 Tomcat 的初始页面是不能显示的。
cp -r webapps.dist/* webapps