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自动补全
在~/.zshrc
中plugins
中添加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