安装
apt update && apt install docker.io
- 更换国内镜像源
- 配置文件地址:
/etc/docker/daemon.json
- 配置文件地址:
# vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com",
"https://registry.docker-cn.com"
]
}
# systemctl restart docker.service
容器管理命令
docker run
-
格式:
docker run [参数] 镜像 [命令] [参数]
- 返回值是容器的ID
-
参数
-d
: 后台运行容器-i
: 以交互模式运行容器- 一般
-it
连用
- 一般
-t
: 提供伪终端- 如果容器的默认命令是
bash
,则以-d
后台运行容器会立刻执行完退出 - 通过
-itd
参数避免一启动就退出
- 如果容器的默认命令是
-e k=v
: 设置环境变量--rm
: 退出容器时自动删除--read-only
: 容器内的文件只读- 应该配合
--link
(连接外部数据库)或者-v
(创建数据卷)使用
- 应该配合
- 重启
--restart=always
: 自动重启--restart=on-failure:5
: 返回非零错误码时重启,最多重启5次
- 数据卷
-v :<容器路径>
: 自动挂载宿主机目录到容器指定目录- 通过
docker inspect <ID>
查找宿主机目录路径
- 通过
-v <宿主机路径>:<容器路径>[:ro]
: 挂载指定宿主机目录或文件到容器指定目录或文件- 宿主机路径和容器路径都必须是绝对路径
- 可以通过
:ro
后缀设置只读挂载, 默认可读可写 - 例子:
- 挂载当前路径
/root/1.txt
文件到容器/wwt
目录:-v /root/1.txt:/wwt/1.txt
/wwt
目录不存在会自动创建
- 只读挂载
/root/wwt
目录到容器/data
目录:-v /root/wwt:/data:ro
- 此时
/data
目录中的内容与/root/wwt
内的内容一致
- 此时
- 挂载当前路径
-v <数据卷名字>:<容器路径>
:挂载docker volume create
创建的命名数据卷--volumes-from=<容器名>
: 共享该容器挂载的数据卷- 可以创建一个数据卷容器,让多个容器共享一个数据卷
- 网络
-P
: Dockerfile中expose的端口会随机映射到主机端口-p <宿主端口>:<容器端口>
: 指定端口映射--link <要连接的容器名>:<在本容器内的别名>
: 链接容器网络- 别名相当于连接容器的域名
- 此时应该使用待连接容器的原端口,而不是映射到宿主机的端口
- 更推荐使用私有网络模式代替link
--net <网络模式>
: 设定容器网络模式- 如none,bridge(默认),host等
--dns <ip地址>
: 指定dns--icc=false
: 关闭容器间的网络通信- 通过iptables实现
--network <name>
加入私有网络--network-alias
修改容器在私有网络中的名字- 该名字用于私有网络的DNS解析
- 由于容器不能充满所以不同网络中运行的第二个redis可能需要叫redis2,但是我们仍然希望让同一网络中的其他容器通过redis这个名字访问
- 资源限制
--memory <size>
: 限制内存- 例如256m, 2g
--cpu-shares <num>
: 设定CPU相对使用权重,数字越大权重越大- 只有一个容器时
--cpu-shares
选项无意义 - 默认值是1024
- 只有一个容器时
-
例子
# 备份c1容器挂载的数据卷到当前宿主机目录
docker run --rm volumes-from c1 -v $(PWD):/backup ubuntu tar cvf /backup/data.tar /data
# 恢复数据到c2
docker run -d --name c2 -v /data ubuntu /bin/bash
docker run --rm -volumes-from c2 -v $(PWD):/backup ubuntu tar xvf /backup/data.tar -C /
# 加入私有网络
docker network create my-net
docker run -d --network my-net --name redis2 --network-alias redis redis:alpine
docker run -it --network my-net busybox ping redis
docker volume
# 查看储存卷
docker volume ls
# 查看volume详细信息,包括在宿主机的挂载点
docker volume inspect <name>
# 创建储存卷,默认自动分配名字
docker volume create <name>
# 连接储存卷
docker run -v <volume_name>:<path>
# 删除储存卷
docker volume rm <name>
# 删除所有未使用数据卷
docker volume prune
docker network
# 显示所有容器网络
docker network ls
# 查看网络详细信息
docker network inspect <name>
# 创建私有容器网络
docker network create <name>
# 加入已经存在的私有容器网络
docker network connect <net> <container>
# 删除网络
docker network rm <name>
# 删除所有未使用网络
docker network prune
docker ps
- 参数
-a
:显示所有容器,包括未运行的-n
:显示最近n个-l
#:显示最近创建的-q
:只显示ID--no-trunc
:不截断-f "k=v"
:按条件过滤status
: 容器状态created, restarting, running, paused, exited, dead
volume
: 挂载指定数据卷的运行中容器network
: 加入指定网络的运行中容器before
与since
:指定容器ID前、后创建的容器expose
: 暴露指定port的运行中容器health
: 容器健康状况healthy, unhealthy, none
- 例子
- 监控容器数量:
docker ps -aq | wc -l
- 也可以用
docker info
- 也可以用
- 列出已经停止的容器:
docker ps -f "status=exited"
- 监控容器数量:
docker create
- 创建一个容器但不启动
- 通过
docker start <name/ID>
启动
- 通过
- 返回值是容器的ID
- 在脚本中可以赋值给一个变量, 例如
CID=$(docker create nginx)
- 在脚本中可以赋值给一个变量, 例如
docker exec
需要容器处于运行状态
# 进入容器终端
docker exec -it <name/ID> /bin/bash
# 运行命令,不进入终端
docker exec <name/ID> ps
docker stop/kill
docker stop
给容器中的init进程发送SIGTERM信号- 只能暂停pid=1的进程,如果有多个进程,后面的进程无法被控制
docker kill
给容器中的init进程发送SIGKILL信号-s
参数指定发送的信号:docker kill -s SIGTRAP <name/ID>
docker rm/rmi
docker rm
删除容器,需要先停止容器docker rm -f
强行删除-v
参数把容器引用的数据卷计数减1
docker rmi
删除镜像- 需要先删除所有使用的容器
# 删除所有容器
docker rm -vf $(docker ps -aq)
#删除停止的容器
docker rm -vf $(docker ps -f "status=exited" -q)
docker container prune
docker cp
在容器和宿主机间复制数据
docker cp <container>:<src_path> <dest_path>
docker cp <dest_path> <container>:<src_path>
容器信息获取命令
-
--no-trunc
获取完整输出信息,不截断 -
docker top <name/ID>
: 获取容器中的进程信息- 默认情况下,该命令获取的CPU使用状况是宿主机的CPU状况而不是容器本身的
- 因为top命令的数据源来自
/proc
, 而该目录没有被linux容器隔离
-
docker logs <name/ID>
: 获取容器启动后的日志-t
显示UTC时间-f
实时输出--since
按时间过滤- 例子:
docker logs --since 2019-04-11T17:17 <name/ID>
- 例子:
--tail <num>
显示最后num条
-
docker port <name/ID>
: 查看容器的端口映射
-
docker stats <name/ID>
: 查看容器资源使用情况- 例如CPU,内存等
- 默认为全部容器
-
docker history <image_name>
:查看镜像的构造历史
镜像管理命令
docker pull
- 从仓库拉取镜像,默认从docker hub拉
docker pull ubuntu:15.1
拉取ubuntu的15.1版本的镜像- 如果不指定tag(版本),则默认拉取最新版
- 没有
/
前缀的为官方库- 一个前缀为
用户/镜像
- 两个前缀为
私有仓库/用户/镜像
- 一个前缀为
docker commit
-
从容器中创造新的镜像
- 例子:我们可以打开一个新的ubuntu容器,然后在这个容器中安装git,然后我们可以以此创建一个含有git的ubuntu镜像
-
-a
提交的镜像作者 -
-m
提交时的说明文字 -
例子:
docker commit -m "ubuntu with git" -a "wwt" 72f1a8a0e394 wwt/ubuntu:git
- 72f1a8a0e394是用来创建镜像的容器ID,也可以用容器名
- wwt/centos:git 是新镜像的仓库名和tag
docker load/save
- save命令把镜像保存到(压缩)文件
docker save -o myfile.tar mysql:latest
- load命令从文件导入镜像
docker load -i myfile.tar
- 上述保存和加载的都是镜像,不是容器
远程API
- 默认情况下docker只接受本机请求,需要通过
-H
参数监听TCP请求- 采取RESTful API进行通信
- 需要修改systemd运行参数
# 找到ExecStart行,修改成下边这样
# ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
vim /lib/systemd/system/docker.service
# 重启docker后台
systemctl daemon-reload
sudo service docker restart
常用命令列表
attach 将标准输入和标准输出连接到正在运行的容器
build 使用dockerfile文件创建镜像
commit 从容器的修改项中创建新的镜像
cp 在容器和宿主机间复制文件
create 创建一个新的镜像
diff 检查容器自从创建以来的更改
events 实时输出docker服务器中发生的事件
exec 从外部运行容器内部的命令
export 将容器导出为tar文件包
history 显示镜像的历史
images 输出镜像列表
import 从压缩为tar文件的文件系统中创建镜像
info 显示当前系统信息、docker容器与镜像个数、设置信息等
inspect 使用JSON格式显示容器与镜像的详细信息
kill 向容器发送kill信号关闭容器
load 从tar文件或标准输入中加载镜像
login 登录docker注册服务器
logout 退出docker注册服务器
logs 输出容器日志信息
pause 暂停容器中正在运行的所有进程
port 查看容器的端口是否处于开放状态
ps 输出容器列表
pull 从注册服务器中拉取一个镜像或仓库
push 将镜像推送到docker注册服务器
rename 重命名一个容器
restart 重启一个或多个容器
rm 删除一个或多个容器,若没有指定标签则删除lastest标签。
rmi 删除一个或多个镜像,若没有指定标签则删除lastest标签。
run 在一个新容器中中运行命令,用于指定镜像创建容器。
save 将一个或多个镜像保存为tar包
search 从Docker Hub中搜索镜像
start 启动一个或多个已经停止的容器
stop 停止一个或多个正在运行的容器
tag 设置镜像标签
top 显示容器中正在运行的进程信息
unpause 重启pause命令暂停的容器
update 更新一个或多个容器的配置
version 显示docker版本信息
wait 等待容器终止然后输出退出码