xshaun's NoteBook

What makes the desert beautiful is that somewhere it hides a well.

Follow me on GitHub

Docker 命令汇总

名词术语

Images Docker 镜像 用于创建 Docker 容器的模板。类似面向对象中的类
Container Docker 容器 独立运行的一个或一组应用
Client Docker 客户端 通过命令行或SDK调用 Docker API (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。现提供几乎所有语言的lib包
Host Docker 主机 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器
Registry Docker 仓库 用来保存镜像。官方提供的Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用
Docker Machine Docker 宿主机 在远程主机/虚拟机/云服务器等上安装并管理docker的工具

安装

  • Ubuntu
# 安装
wget -qO- https://get.docker.com/ | sh 
#或 
sudo apt-get install docker-ce

# 安装完成后,如果要以非root用户可以直接运行docker时,需执行以下命令
sudo groupadd docker
sudo usermod -aG docker $USER

# 启动docker服务
sudo service docker start 
# 或
sudo systemctl enable docker
sudo systemctl start docker

# 测试
docker run hello-world
  • macOS
brew cask install docker
  • 修改docker镜像源
#  ~/.docker/daemon.json
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}
# 或者启动时添加参数
docker run hello-world --registry-mirror=https://registry.docker-cn.com
  • tab自动补全
    ~/.zshrcplugins 中添加 docker docker-compose

运行

单次命令执行
docker run ubuntu:18.04 /bin/echo "Hello world"

ubuntu:18.04 指定运行的镜像,若本地主机不存在,则会从镜像源下载 /bin/echo “Hello world” 在启动的容器里执行命令

交互式执行
docker run -i -t ubuntu:18.04 /bin/bash

-t: 在新容器内指定一个伪终端/终端
-i: 允许你对容器内的标准输入(stdin)进行交互
通过 exit 或 CTRL+D 退出容器

后台模式执行
docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

-d: 让容器在后台运行
通过 docker ps 查看是否运行,且Container ID或NAME
通过 docker logs ID/NAME 查看容器内的标准输出(stdout)
通过 docker stop ID/NAME 停止容器

命令解释

container lifecycle
docker create # 创建一个新的容器但不启动它,用法同 docker run
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  -t # 在新容器内指定一个伪终端/终端
  -i # 允许你对容器内的标准输入(stdin)进行交互
  -d # 让容器在后台运行
  --name # 指定容器名称
  -p HOST_PORT:CONTAINER_PORT # 指定容器内部端口映射到主机上
  -p HOST_PORT:CONTAINER_PORT/udp # 默认是tcp,可以指定为udp
  -p IP:HOST_PORT:CONTAINER_PORT # 也可以添加需要映射的IP地址
  -P # 将容器内暴露的端口随机映射到主机的高端口
  -v HOST_PATH:CONTAINER_PATH # 将主机文件夹/文件挂载到容器内
  -w PATH # 指定容器内的 Working directory
  -e KEY=VALUE # 设置环境变量
  --dns 8.8.8.8 # 指定容器使用的DNS服务器,默认和宿主一致
  --dns-search example.com # 指定容器DNS搜索域名,默认和宿主一致
  -h "mars" # 指定容器的hostname
  --cpuset="0,1,2" # 绑定容器到指定CPU运行
  -m NUM # 设置容器使用内存最大值bytes
  --net="bridge" # 指定容器的网络连接类型,支持 bridge/host/none/container
  --link CONTAINER_NAME:ALIAS_NAME# 将received container连接到一个名为CONTAINER_NAME的source container,则received可以访问到source中的mysql等服务和环境变量等
  --expose=[] # 开放一个端口或一组端口

docker start ID/NAME
docker restart ID/NAME
docker stop ID/NAME

docker kill ID/NAME
	-s 信号 # 向容器发送一个信号,如KILL

docker rm ID/NAME
  -f # 强制删除运行中容器
  -l # 删除容器间的连接,并非容器
  -v # 删除容器,同时删除挂载的数据卷

docker pause ID/NAME # 暂停容器中所有的进程。
docker unpause ID/NAME # 恢复容器中所有的进程
container operations
docker container --help

docker ps # docker container ls
  -a # 所有状态的容器
  -s # 显示总计文件大小
  -l # 最后一次创建的
  -n NUM # 最后N次创建的
  -q # 仅显示CONTAINER IDs
  -f KEY=VALUE # 增加过滤条件

docker exec [OPTIONS] ID/NAME COMMAND [ARG...] # 在运行的容器中执行命令
  -d # 分离模式: 在后台运行
  -i # 即使没有附加也保持STDIN 打开
  -t # 分配一个伪终端

docker inspect ID/NAME # 查看容器/镜像的配置和状态信息
	--format='' # 过滤需要的信息

docker events [OPTIONS] # 从服务器获取实时事件
  -f KEY=VALUE # 根据条件过滤事件;
  --since='' # 从指定的时间戳后显示所有事件;
  --until='' # 流水时间显示到指定的时间为止

docker rename ID/NAME NEW_NAME

docker top ID/NAME # 查看容器中运行的进程信息

docker attach ID/NAME # 连接到正在运行中的容器。

docker logs ID/NAME # 查看容器内的标准输出
  -f # 跟踪容器内的标准输出,像使用 tail -f
  -t # 显示时间戳
  --since # 显示某个开始时间的所有日志
  --tail NUM # 输出最后NUM行

docker port ID/NAME # 查看容器端口的映射情况

docker wait ID/NAME # 阻塞运行直到容器停止,然后打印出它的退出代码

docker export -o `date +%Y%m%d`.tar ID/NAME# 将文件系统作为一个tar归档文件导出
container rootfs
docker commit -m="update" -a="author" ID/NAME USER_NAME/IMAGE_NAME:TAG # 从容器中导出新镜像
  -m # 提交描述信息,类似git commit -m
  -a # 指定镜像作者
  -p # 在commit时,将容器暂停

docker cp # 容器与主机之间的数据拷贝,容器地址格式 CONAINTER_ID:PATH
	-L # 保持源目标中的链接

docker diff ID/NAME # 检查容器里文件结构的更改
local image
docker image --help

docker images # docker image ls
             # REPOSITORY:表示镜像的仓库源
             # TAG:镜像的标签
             # IMAGE ID:镜像ID
             # CREATED:镜像创建时间
             # SIZE:镜像大小
  -a # 列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层)
  --digests # 显示镜像的摘要信息

docker rmi [OPTIONS] IMAGE [IMAGE...] # 删除本地一个或多少镜像
  -f # 强制删除;
  --no-prune # 不移除该镜像的过程镜像,默认移除;

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG] # # 给镜像添加新的标签

docker build [OPTIONS] PATH/URL/. # 从Dockerfile创建镜像
  -t USER_NAME/IMAGE_NAME:TAG # 指定创建的目标镜像名tag
  -f # 指定要使用的Dockerfile路径;. 表示搜索当前目录的Dockerfile

docker history [OPTIONS] IMAGE # 查看镜像的创建历史

docker save [OPTIONS] IMAGE [IMAGE...] # 将指定镜像保存成 tar 归档文件
	-o # 输出到的文件。

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG] # 从归档文件中创建镜像
  -c # 应用 docker 指令创建镜像;
  -m # 提交时的说明文字;
registry mirror
docker login -u NAME -p PIN # 登陆到镜像仓库,默认是Docker Hub
docker logout

docker pull IMAGE:TAG # 下载镜像至本地主机
	-a # 拉取所有 tagged 镜像

docker push IMAGE:TAG # 上传镜像至仓库中

docker search IMAGE # 搜索镜像
Docker info/version
docker info/version # 查看docker的版本和配置等信息

docker COMMAND --help # 查看命令使用方法

Dockerfile

每一条指令都会在镜像上创建一个新层
每一条指令的前缀都必须大写

# Use an official Python runtime as a parent image
FROM python:2.7-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . /app

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]

样例

# nginx
docker run -p 80:80 --name mynginx -v $PWD/www:/www -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/wwwlogs  -d nginx

# mysql
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123qwe -d mysql
docker exec -it mysql bash #进入容器
# login
mysql -u root -p
ALTER USER 'root'@'localhost' IDENTIFIED BY '123qwe';
# 添加远程登录用户
CREATE USER 'remoteuser'@'%' IDENTIFIED WITH mysql_native_password BY '123qwe';
GRANT ALL PRIVILEGES ON *.* TO 'remoteuser'@'%';

# tomcat
docker run --name tomcat -p 8080:8080 -v $PWD/test:/usr/local/tomcat/webapps/test -d tomcat  

# python
docker run -v $PWD/myapp:/usr/src/myapp -w /usr/src/myapp python:3.5 python helloworld.py

# redis
docker run -p 6379:6379 -v $PWD/data:/data -d redis:3.2 redis-server --appendonly yes
docker exec -it CONTAINER_ID redis-cli

# Mongo
docker run -p 27017:27017 -v $PWD/db:/data/db -d mongo:3.2
docker run -it mongo:3.2 mongo --host 172.17.0.1 # 使用mongo镜像执行mongo 命令连接到刚启动的容器, 如果主机IP为172.17.0.1

# Apache
docker run -p 80:80 -v $PWD/www/:/usr/local/apache2/htdocs/ -v $PWD/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf -v $PWD/logs/:/usr/local/apache2/logs/ -d httpd


GO-BACK     UP-LEVEL TOP