Search K
Appearance
Appearance
Docker 安装命令:
curl -fsSL https://get.docker.com | bash -s docker
Docker 安装后需要启动 docker 的 daemon 进程,才可以在命令行使用 docker 命令。
# linux 环境下 启动docker
systemctl start docker
# 设置开机启动
systemctl enable docker
# 重启 systemd
systemctl daemon-reload
编辑 daemon.json 配置文件文件:
vi /etc/docker/daemon.json
镜像仓库是个数组,可以配置多个镜像仓库源(下面这些是免费的(可能会失效)):
{
"registry-mirrors": [
"https://docker.211678.top",
"https://docker.1panel.live",
"https://hub.rat.dev",
"https://docker.m.daocloud.io",
"https://do.nark.eu.org",
"https://dockerpull.com",
"https://dockerproxy.cn",
"https://docker.awsl9527.cn"
]
}
设置完成之后需要重启 docker 的 daemon 进程。
systemctl daemon-reload # 重新加载配置
systemctl restart docker # 重启docker
查看 docker 版本
docker version
查看 docker 详细信息,包括镜像源设置信息
docker info
# 镜像, 下方命令中出现的image都可以使用name或者hash
docker search image # 搜索镜像
# 拉取镜像 mirrors.tencent.com/tlinux/tlinux2.2:latest
docker pull image
docker images # 查看镜像列表
docker image list # 查看镜像列表
docker inspect image # 查看构建镜像的详细信息
docker rmi image # 删除镜像
docker image rm # 删除镜像
# --all 查看所有容器
docker ps -a
# 创建一个后台运行容器,容器名称 name,容器状态 up
docker run -d --name name image
# 创建一个容器, 容器名称 name, 容器状态 create
docker create --name name image
# 启动/停止/删除容器
docker start/stop/rm container
# 连接容器的输入输出流, ctrl c会打断容器运行状态
docker attach container
# 查看容器输出日志
docker logs -f container
# exec从容器内部执行命令并输出到当前输出流
docker exec container cmd
# 生成交互终端连接到容器内不执行命令
docker exec -it container/hash cmd
# 查看容器信息
docker inspect container/hash
# 查看网卡列表
docker network ls
# 创建网络, -d 指定 driver 类型
docker netwwork create -d bridge network-name
# 创建容器时, 指定接入的网络名称
docker run -d --network network-name image
# 查看网络实体的信息, 可以查看有哪些容器接入了该网络
docker network inspect network-name
# 容器 接入/退出接入 网络
docker network connect/disconnet network-name container
镜像完整名称组成
镜像名称通常是由 <registry>/<namespace>/<repository>:<tag> 组成。
registry是镜像仓库源,namespace是用户,repository是镜像名称,tag是镜像版本。
通常不需要写明镜像仓库源,默认会从 daemon.json 配置文件中配置的仓库源拉取镜像。
如果是镜像仓库源的官方镜像,比如 Docker Hub 的官方镜像,也可以省略 namespace,
直接使用 <repository>:<tag>, 比如 docker pull nginx:latest。
如果是用户上传镜像,则需要添加用户名,也就是 namespace,
docker pull vaultwarden/server:latest
对一个镜像进行修改后,可以像 git 一样 commit 提交,生成一个新的镜像。本地的镜像名称可以任意取名,只要不和本地的 image 镜像冲突即可。
# 未命名的提交, 所以只有hash id
docker commit webapp
# 未命名提交, 像git一样附带提交信息
docker commit -m "configured" webapp
# 命名提交
docker commit webapp webapp:1.0
# 命名镜像, 根据镜像id标识镜像并重命名
docker tag obc44e2 webapp:1.0
# 命名镜像, 根据镜像名称标识镜像并重命名
docker tag webapp:1.0 webapp:2.0
推送到镜像仓库源
如果想要推送到远程镜像仓库,则对镜像命名有要求,需要添加用户名称,也就是 namespace,才能推送到远程仓库。
示例: docker commit nginx lunode/myNginx:1.1
导出镜像:
# 导出镜像成tar包
docker save webapp:1.0 > webapp-1.0.tar
# -o 指定镜像导出路径ouput
docker save -o ./webapp-1.0.tar webapp:1.0
# 打包多个镜像,mysql
docker save -o ./images.tar webapp:1.0 nginx:1.12 mysql:5.7
导入镜像:
#导入镜像
docker load < webapp-1.0.tar
#-i指定导入的文件名称
docker load -i webapp-1.0.tar
导出容器:
# 导出镜像
docker export -o ./webapp.tar webapp
# 导入镜像
docker import ./webapp.tar webapp:1.0
docker 可以使用 bindMount方式
,将服务器目录映射到容器内部,又或者使用 Date Volume方式
,创建一个持久化的 volume 数据卷,映射到容器中。
把 Host 主机的文件目录映射到容器内目录。
# 使用-v或--volume 来使用 Bind Mount的方式
docker run -d --name nginx \
-v /webapp/html:/usr/share/nginx/html nginx:1.12
# docker 文件目录挂在默认是rw读写权限 也可以是只读权限 ro
docker run -d --name nginx \
-v /webapp/html:/usr/share/nginx/html:ro nginx:1.12
# 通过docker inspect 查看 Mounts挂载项
# Source代表物理机目录, Destination表示容器内目录
docker inspect container/hash
docker inspect container/hash -f "{{.Mount}}"
具名或者不具名一个 Volume 映射到容器内目录,Volume 由 docker 管理,存储在宿主机的物理路径上,可以通过 docker inspect <congianer>
来查看容器挂载文件目录和数据卷的状态。
# 创建一个不具名的数据卷,映射到容器的 /webapp/storage 目录
docker run -d --name webapp -v /webpapp/storage webapp:latest
#创建一个命名数据卷,appDate就是数据卷的标识名称
docker run -d --name webapp -v appData:/webapp/storage webapp:latest
Tmpfs Mount方式
是将物理机的内存挂载到容器文件目录上,所以没有 source 路径,只需要指定容器内的路径即可。
# 将容器中 /webapp/cache 临时目录挂载到内存中
docker run -d --name webapp --tmpfs /webapp/cache webapp:latest
docker run -d --name container-name \
-v volume-name:/path/to/container webapp:latest
# ro 表示read only 仅有读取权限, 默认是rw
docker run -d --name container-name \
-v volume-name:/path/to/container:ro nginx:1.12
# 创建volume
docker volume create volume-name
# 查看volume列表
docker volume ls
# 删除volume
docker volume rm volume-name
# 根据容器名来查找并删除数据卷
docker rm -v container-name
# 清楚所有volume
docker volume prune -f
数据卷容器是指定一个容器充当数据卷的功能,然后其它容器将数据卷容器作为 source 挂载到容器内部的目录。
# 创建一个数据卷容器, 这里会生成一个不具名的数据卷, 可以inspect来查看具体的volume信息
docker create --name volume-container-name \
-v /path/to/container ubuntu
# 运行容器并将数据卷容器作为数据卷挂载到容器上
docke run -d --volumes-from volume-container-name \
-v /path/to/container image
docker run --rm --volumes-from volume-container-name \
-v /path/to/container \
-v /backup:/backup \
ubuntu \
tar czvf /backup/backup.tar /path/to/container
参数解释:
参数 | 作用 |
---|---|
--rm | 容器停止运行时会自动删除 |
-v /path/to/contianer | 生成一个不具名的 volume 映射到该路径 |
--volumes-from volume-container-name | 将一个具名的数据卷容器作为 volume,替代不具名的 volume |
tar czvf /backup/backup.tar /path/to/container | 将数据卷容器映射到/path/to/container 目录后,将该目录打包放在容器内的 /backup/backup.tar 文件中,因为该目录映射到了宿主机,所以容器卷存放的数据就成功被打包迁移到宿主机 |
docker run --rm --volumes-from volume-container-name \
-v /path/to/container \
-v /backup:/backup \
ubuntu \
tar xzvf /bakcup/backup.tar /path/to/container
参数解释:同 备份迁移数据卷
如果主机中目录存在,则会将 copy 的目录放入目标目录下,如果不存在则正常创建
NOTE
docker cp source destination
# 运行一个nginx镜像
docker run -d --name nginx nginx:alpine
docker cp nginx:/etc/nginx /etc/nginx
docker cp /backup nginx:/backup
TIP
如果宿主机 /etc/nginx
目录已经存在,则会将 nginx:/etc/nginx
目录放入 /etc/nginx
目录下, 目录结构就是 /etc/nginx/nginx
如果宿主机不存在 /etc/nginx
目录,则会将 nginx:/etc/nginx
目录 copy 到 /etc/nginx
, 目录结果就是 /etc/nginx