Docker常用命令
1. 镜像
1.1 获取镜像
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
具体的选项可以通过 docker pull --help
命令看到, 这里我们说一下镜像名称的格式
- Docker 镜像仓库地址: 地址的格式一般是
<域名/IP>[:端口号]
. 默认地址是 Docker Hub - 仓库名: 如之前所说, 这里的仓库名是两段式名称, 即
<用户名>/<软件名>
. 对于 Docker Hub, 如果不给出用户名, 则默认为library
, 也就是官方镜像
1.2 列出镜像
➜ ~ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
redis 5.0.5-alpine ed7d2ff5a623 2 weeks ago 29.3MB
ubuntu latest a2a15febcdf3 3 weeks ago 64.2MB
redis latest f7302e4ab3a8 3 weeks ago 98.2MB
sonatype/nexus3 latest 35ca857d5b19 4 weeks ago 599MB
列表包含了 仓库名
、标签
、镜像 ID
、创建时间
以及 所占用的空间
其中仓库名和标签在之前的基础概念章节已经介绍过了. 镜像 ID 则是镜像的唯一标识, 一个镜像可以对应多个 标签. 因此, 在上面的例子中, 我们可以看到 redis:5.0.5-alpine
和 redis:latest
拥有相同的 ID, 因为它们对应的是同一个镜像
1.3 镜像大小
➜ ~ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 3 1 761.2MB 162.4MB (21%)
Containers 1 1 32.93kB 0B (0%)
Local Volumes 1 1 200.9MB 0B (0%)
Build Cache 0 0 0B 0B
1.4 删除虚悬镜像
➜ ~ docker image prune
虚悬镜像: 这个镜像既没有仓库名, 也没有标签, 均为 <none>
.
<none> <none> 00285df0df87 5 days ago 342 MB
1.5 列出部分镜像
➜ ~ docker image ls ubuntu
后面的 ubuntu 必须是 REPOSITORY
的名字.
1.6 删除本地镜像
docker image rm [选项] <镜像1> [<镜像2> ...]
其中, <镜像>
可以是 镜像短 ID
、镜像长 ID
、镜像名
或者 镜像摘要
还可以使用下面命令进行删除.
docker image rm $(docker image ls -q redis)
1.7 将容器保存为镜像(不推荐使用docker commit)
# 创建一个容器
➜ ~ docker run --name webserver -d -p 8080:80 nginx
# 修改容器中的内容
➜ ~ docker exec -it webserver bash
root@e19b32b24b6c:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
root@e19b32b24b6c:/# exit
exit
# 查询内容变化
➜ ~ docker diff webserver
C /run
A /run/nginx.pid
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
C /usr
C /usr/share
C /usr/share/nginx
C /usr/share/nginx/html
C /usr/share/nginx/html/index.html
C /root
A /root/.bash_history
# 将容器保存为镜像
➜ ~ docker commit \
> --author "snailwu" \
> --message "修改了默认页面" \
> webserver \
> nginx:v1
sha256:8e660a0a87246c4186174dc77e565328c94186e81282b0845d04c93330043722
# 使用新镜像运行
➜ ~ docker run --name web2 -d -p 81:80 nginx:v1
推荐使用 Dockerfile 定制镜像
2. 容器
2.1 启动
# 输出HelloWorld之后, 容器遍退出了
➜ ~ docker run ubuntu /bin/echo "Hello World"
Hello World
# 使用 -t分配一个伪终端, -i让容器的标准输入保持打开
➜ ~ docker run -i -t ubuntu /bin/bash
root@5bf06b2f00bd:/# pwd
/
root@5bf06b2f00bd:/#
## 启动已终止容器
➜ ~ docker container start xxx
➜ ~ docker start xxx
2.2 后台运行
加上 -d
参数即可.
2.3 终止
➜ ~ docker container stop xxx
➜ ~ docker stop xxx
2.4 进入容器
使用 docker exec -it xxx /bin/bash
即可.
2.5 删除容器
# 删除终止状态的容器
➜ ~ docker container rm xxx
➜ ~ docker rm xxx
如果要删除一个运行中的容器, 可以添加 -f
参数. Docker 会发送 SIGKILL
信号给容器.
快速清除所有终止状态的容器
➜ ~ docker container prune
3. 仓库
3.1 登录/退出
➜ ~ docker login
➜ ~ docker logout
如果需要 docke push
之类的操作就需要登录了
4. 数据管理
4.1 数据卷
数据卷
是一个可供一个或多个容器使用的特殊目录, 它绕过 UFS, 可以提供很多有用的特性:
数据卷
可以在容器之间共享和重用- 对
数据卷
的修改会立马生效 - 对
数据卷
的更新, 不会影响镜像 数据卷
默认会一直存在, 即使容器被删除
注意:
数据卷
的使用, 类似于 Linux 下对目录或文件进行 mount, 镜像中的被指定为挂载点的目录中的文件会隐藏掉, 能显示看的是挂载的数据卷
.
# 创建数据卷
➜ ~ docker volume create my-vol
# 查看所有数据卷
➜ ~ docker volume ls
# 查看数据卷信息
➜ ~ docker volume inspect my-vol
# 启动一个挂载数据卷的容器
➜ ~ docker run --name web -d -p 80:80 \
> --mount source=my-vol,target=/webapp \
> nginx
# 删除数据卷
➜ ~ docker volume rm my-vol
# 清理无用的数据卷
➜ ~ docker volume prune
使用 docker inspect web
查看容器信息, 数据卷信息在 "Mounts" Key下面.
"Mounts": [
{
"Type": "volume",
"Name": "my-vol",
"Source": "/var/lib/docker/volumes/my-vol/_data",
"Destination": "/webapp",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
4.2 挂载主机目录
# 挂载目录
➜ ~ docker run --name web -d -p 80:80 \
> --mount type=bind,source=/src/webapp,target=/opt/webapp \
> nginx
# 挂载文件, 记录容器输入过的命令
➜ ~ docker run -rm -it \
> --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history \
> ubuntu /bin/bash
默认是挂载的是读写权限, 可以加上 readonly
参数指定为只读.
5. 网络
5.1 外部访问容器
使用 -p
来映射端口.
-p
则可以指定要映射的端口, 并且, 在一个指定端口上只可以绑定一个容器.
支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
.
其它命令:
# 查看容器端口
➜ ~ docker host web
5.2 容器互联
# 创建网咯
➜ ~ docker network create -d bridge wu-net
# 新建容器 web1
➜ ~ docker run -d --name web1 --network wu-net -p 81:80 nginx
# 新建容器 web2
➜ ~ docker run -d --name web2 --network wu-net -p 82:80 nginx
# 查看 wu-net 网络
➜ ~ docker network inspect wu-net
最后会看到 web1 和 web2 在一个网段内.
5.3 配置DNS
将主机的 DNS 配置文件挂载到容器中, 这样主机中的 DNS 文件发生变化时, 所有容器的 DNS 就会立刻发生更新.
还可以在 /etc/docker/daemon.json
文件中加入 DNS 信息:
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
这样每次启动的容器 DNS 自动配置为 114.114.114.114
和 8.8.8.8
.
如果用户想要手动指定容器的配置, 可以在使用 docker run
命令启动容器时加入如下参数:
-h HOSTNAME
或者 --hostname=HOSTNAME
设定容器的主机名, 它会被写到容器内的 /etc/hostname
和 /etc/hosts
. 但它在容器外部看不到, 既不会在 docker container ls
中显示, 也不会在其他的容器的 /etc/hosts
看到.
--dns=IP_ADDRESS
添加 DNS 服务器到容器的 /etc/resolv.conf
中, 让容器用这个服务器来解析所有不在 /etc/hosts
中的主机名.
--dns-search=DOMAIN
设定容器的搜索域, 当设定搜索域为 .example.com
时, 在搜索一个名为 host 的主机时, DNS 不仅搜索 host, 还会搜索 host.example.com
.
注意: 如果在容器启动时没有指定最后两个参数, Docker 会默认用主机上的
/etc/resolv.conf
来配置容器.
座右铭:不要因为知识简单就忽略,不积跬步无以至千里。
版权声明:自由转载-非商用-非衍生-保持署名。
本作品采用知识共享署名 4.0 国际许可协议进行许可。
----------------------------------------------------------------------