Skip to content

Docker

安装

bash
$ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

卸载

bash
# Ubuntu | Debian
$ sudo apt-get remove docker docker-engine

# CentOS
$ sudo yum remove docker \
docker-common \
container-selinux \
docker-selinux \
docker-engine

# 卸载Docker后,/var/lib/docker/目录下会保留原Docker的镜像,网络,存储卷等文件. 如果需要全新安装Docker,需要删除/var/lib/docker/目录
$ rm -fr /var/lib/docker/

常用命令

bash
# 查看 Docker 版本信息
$ docker version

# 查看 Docker 简要信息
$ docker -v

# 启动 Docker
$ systemctl start docker

# 关闭 Docker
$ systemctl stop docker

# 设置开机启动
$ systemctl enable docker

# 重启 Docker 服务
$ service docker restart

# 关闭 Docker 服务
$ service docker stop

镜像

docker 仓库地址凭证由 docker login 管理 docker 与各个仓库地址默认以 https:// 来通信,除非仓库地址允许其他方式访问,参考 docker-insecure-registries

bash
# 检索镜像
$ docker search [image-name]

# 拉取镜像
$ docker pull [OPTIONS] NAME[:TAG|@DIGEST]

# 例如 从镜像地址为:10.100.68.85:5000, 拉取镜像文件:testing/test-image
# docker pull [选项] [地址:端口号]仓库名
$ docker pull 10.100.68.85:5000/testing/test-image

镜像管理

bash
# 列出镜像
$ docker images
# or
$ docker image ls

# 删除镜像
$ docker rmi [image-ID]

# 导出镜像
$ docker save

# 导入镜像
$ docker load

# 镜像构建
$ docker build

# 镜像运行
$ docker run [image-ID]

容器

bash
# 启动:启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。
# 新建并启动
$ docker run [image-name/image-ID]
# 启动已终止容器
$ docker start [image-ID]

# 例如: 运行 mysql 容器
# 加-itd参数是让docker启动后能一直运行,如果不加,则在容器启动后执行完就立刻退出了。
# -p 3306:3306: 映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。
# MYSQL_ROOT_PASSWORD=123456: 设置 MySQL 服务 root 用户的密码。
# --restart=always: 添加此参数以确保容器在启动时自动重新启动。
$ docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --restart=always mysql

# 查看容器
# 列出本机运行的容器
$ docker ps
# 列出本机所有的容器(包括停止和运行)
$ docker ps -a

# 停止容器
# 停止运行的容器
$ docker stop [image-ID]
# 杀死容器进程
$ docker kill [image-ID]

# 重启容器
$ docker restart [image-ID]

# 删除容器
$ docker rm [image-ID]

# 强制停止容器 + 删除容器
$ docker rm [image-ID] -f

# 进入容器
# 如果从这个 stdin 中 exit,会导致容器的停止
$ docker attach [image-ID]
# 交互式进入容器
$ docker exec [image-ID]

# docker exec 说明
# docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
# OPTIONS: -d: 分离模式: 在后台运行; -i :即使没有附加也保持STDIN 打开; -t :分配一个伪终端
$ docker exec -it redis-dd /bin/bash

# 导出容器
$ docker export [image-ID]

# 导入容器
$ docker import [image-ID]

# 查看日志
$ docker logs [image-ID]

# docker logs 说明
# docker logs [OPTIONS] CONTAINER
# OPTIONS: -f : 跟踪日志输出; --since :显示某个开始时间的所有日志; -t : 显示时间戳; --tail :仅列出最新N条容器日志
$ docker logs -f nginx-dd

# 查看容器nginx-dd从2021年4月16日后的最新10条日志。
$ docker logs --since="2021-04-16" --tail=10 nginx-dd

# 复制
# 将主机/www/runoob目录拷贝到容器 2baa66d08aae 的/www目录下。
$ docker cp /www/runoob 2baa66d08aae:/www/

# 将主机/www/runoob目录拷贝到容器 2baa66d08aae 中,目录重命名为www。
$ docker cp /www/runoob 2baa66d08aae:/www

# 将容器 2baa66d08aae 的/www目录拷贝到主机的/tmp目录中。
$ docker cp  2baa66d08aae:/www /tmp/

# 设置自动启动(运行中的任务)
$ docker update --restart=always [image-ID]

常用的批量操作

bash
# 启动所有容器
$ docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)

# 关闭所有容器
$ docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)

# 删除所有容器
$ docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)

# 删除所有镜像(慎用)
$ docker rmi $(docker images | awk '{print $3}' |tail -n +2)

常用命令总结

Docker环境信息   info, version
容器生命周期管理  create, exec, kill, pause, restart, rm, run, start, stop, unpause
镜像仓库命令      login, logout, pull, push, search
镜像管理          build, images, import, load, rmi, save, tag, commit
容器运维操作      attach, export, inspect, port, ps, rename, stats, top, wait, cp, diff, update
容器资源管理      volume, network
系统信息日志      events, history, logs

events打印容器的实时系统事件
history 打印出指定镜像的历史版本信息
logs打印容器中进程的运行日志

Dockerfile

Dockerfile 构建镜像 Dockerfile 是一个文本格式的配 文件,用户可以使用 Dockerfile 来快速创建自定义的镜像。 Dockerfile 由一行行行命令语句组成,并且支持以#开头的注释行。

常见指令

FROM: 指定基础镜像
RUN: 镜像运行脚本
CMD: 容器启动命令
EXPOSE: 设置镜像暴露端口
ENV: 设置环境变量
COPY: 复制文件,可将文件和目录复制到容器
ADD: 	更高级的复制文件,可将文件和目录复制到容器,可以支持本地.tar文件
CMD: 容器启动命令,可以覆盖参数,只能有一个CMD
ENTRYPOINT: 镜像入口程序
ARG: 编译镜像加入的参数
VOLUME: 容器的挂载卷 or 创建目录安装点以访问和存储持久数据
WORKDIR: 用于设置工作目录
USER: 指定当前用户

实例

dockerfile
FROM nginx:1.19-alpine
ARG DOMAIN=''
ENV NGINX_HOST ${DOMAIN}
COPY ./dist /usr/share/nginx/html/
COPY ./middleend.aeonbuy.com.conf.template /etc/nginx/templates/

可运行测试

bash
# 加入当前项目 运行命令
# -t 是给镜像命名 . 是基于当前目录的Dockerfile来构建镜像
$ docker build -t reactnginxcontainer .

# 查看本地镜像
$ docker image ls | grep reactnginxcontainer

# 启动 reactnginxcontainer 镜像容器
# docker run 基于镜像启动一个容器
# -p 3000:80 端口映射,将宿主的3000端口映射到容器的80端口
# -d 后台方式运行
# --name 容器名 查看 docker 进程
$ docker run \
    -p 3000:80 \
    -d --name reactApp \
    reactnginxcontainer

镜像加速,Docker 换源

阿里云镜像加速:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

在 /etc/docker/daemon.json 文件中添加以下参数

bash
# 没有该文件则新建
$ mkdir -p /etc/docker

$ vi /etc/docker/daemon.json

{
  "registry-mirrors": ["https://9cpn8tt6.mirror.aliyuncs.com"]
}

# 加载新的配置文件
$ systemctl daemon-reload

# 重启 docker 服务
$ systemctl restart docker

learning Docker

Docker 官方主页:https://www.docker.com Docker 官方博客:https://blog.docker.com/ Docker 官方文档:https://docs.docker.com/ Docker 镜像下载:https://hub.docker.com/search?q=&type=image Docer从入门到实践:https://yeasy.gitbook.io/docker_practice/ DaoCloud Services 文档:http://guide.daocloud.io/dcs/