Docker教程及使用手册

关键名词

image镜像

Docker Images是一个只读模板,用来运行Docker容器

docker container容器

Docker用容器来运行应用,负责应用程序的运行,包括操作系统、用户添加的文件以及元数据。容器是从镜像创建出来的实例(好有面向对象的感觉,类和对象),它可以被启动、开始、停止和删除。

仓库

存放镜像的文件的场所。比如最大的公开仓库是Docker Hub

docker 组件与元素:

  • Docker Client 是用户界面,它支持用户与Docker Daemon之间通信。
  • Docker Daemon运行于主机上,处理服务请求。
  • Docker Index是中央registry,支持拥有公有与私有访问权限的Docker容器镜像的备份。

    docker安装

    1
    curl -sSL https://get.daocloud.io/docker | sh

    镜像仓库管理命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub eg:docker login -u 用户名 -p 密码
    docker login [OPTIONS] [SERVER]
    # 登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
    docker logout [OPTIONS] [SERVER]
    # 在镜像仓库中搜索镜像 eg:docker search 10 java
    docker search [OPTIONS] TERM
    # 从镜像仓库中拉取或者更新指定镜像 eg:docker pull java
    docker pull [OPTIONS] NAME[:TAG|@DIGEST]
    # 推将本地的镜像上传到镜像仓库,要先登陆到镜像仓库 eg:docker push myapache:v1
    docker push [OPTIONS] NAME[:TAG]

    docker镜像管理命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # 列出所有镜像,同 docker image ls,docker image ls -a 列出所有镜像,包括中间镜像
    docker images [OPTIONS] [REPOSITORY[:TAG]]
    # 删除镜像,同 docker image rm IMAGE
    docker rmi [OPTIONS] IMAGE [IMAGE...]
    # 从tar文件中载入镜像 eg:docker load < busybox.tar.gz
    docker load
    # 保存镜像为tar文件 eg:docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3
    docker save [OPTIONS] IMAGE [IMAGE...]
    # docker tag : 标记本地镜像,将其归入某一仓库,eg: docker tag ubuntu:15.10 runoob/ubuntu:v3
    docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
    # 删除 所有未被 tag 标记和未被容器使用的镜像
    docker image prune
    # 删除 所有未被容器使用的镜像
    docker image prune -a
    # 删除 所有停止运行的容器
    docker container prune
    # 使用 Dockerfile 创建镜像 eg:docker build --rm=true -t runoob/ubuntu:v1 . --rm=true表示构建成功后,移除所有中间容器 --no-cache=false表示在构建过程中不使用缓存
    docker build [OPTIONS] PATH | URL | -
    # 查看指定镜像的创建历史 eg:docker history runoob/ubuntu:v3
    docker history [OPTIONS] IMAGE

    其他命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 显示 Docker 系统信息,包括镜像和容器数
    docker info [OPTIONS]
    # 显示 Docker 版本信息
    docker version [OPTIONS]
    # 从容器创建一个新的镜像 eg:docker commit -a "runoob.com" -m "my apache" a404c6c174a2 mymysql:v1
    docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    # 用于容器与主机之间的数据拷贝 eg:docker cp /www 96f7f14e99ab:/www/,docker cp 96f7f14e99ab:/www /tmp/
    docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
    # 检查容器里文件结构的更改
    docker diff [OPTIONS] CONTAINER
    # Show docker disk usage
    docker system df
    # Display system-wide information
    docker system info

    容器操作命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    # 列出容器 
    docker ps [OPTIONS]
    # 获取容器/镜像的元数据 eg:inspect mysql:5.6
    docker inspect [OPTIONS] NAME|ID [NAME|ID...]
    # 查看容器中运行的进程信息,支持 ps 命令参数 eg:docker top mysql
    docker top [OPTIONS] CONTAINER [ps OPTIONS]
    # 连接到正在运行中的容器 【慎用】 eg:docker attach b22cc1880b7a
    docker attach [OPTIONS] CONTAINER
    # 从服务器获取实时事件
    docker events [OPTIONS]
    # 获取容器的日志
    docker logs [OPTIONS] CONTAINER
    # 阻塞对指定容器的其它调用方法,直到容器停止后退出阻塞
    docker wait [OPTIONS] CONTAINER [CONTAINER...]
    # 将文件系统作为一个tar归档文件导出到STDOUT eg:docker export -o mysql.tar a404c6c174a2
    docker export [OPTIONS] CONTAINER
    # 从归档文件中创建镜像 eg:docker import my_ubuntu_v3.tar runoob/ubuntu:v4
    docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
    # 列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口 eg:docker port mymysql
    docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]
    # 删除一个或多个容器 eg:docker rm -f db01
    docker rm [OPTIONS] CONTAINER [CONTAINER...]
    # 创建一个新的容器但不启动它 eg:docker create --name myrunoob nginx:latest
    docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

容器生命周期管理

docker run 创建一个新的容器并运行一个命令【重要】

语法:docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
OPTIONS说明:
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的高端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
--volume , -v: 绑定一个卷

eg:

1
2
3
4
# 使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx
docker run --name mynginx -d nginx:latest
# 使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data
docker run -p 80:80 -v /data:/data -d nginx:latest

start/stop/restart 命令

1
2
3
4
5
6
7
8
9
10
11
12
13
docker start :启动一个或多个已经被停止的容器
docker stop :停止一个运行中的容器
docker restart :重启容器
docker kill :杀掉一个运行中的容器
docker pause :暂停容器中所有的进程
docker unpause :恢复容器中所有的进程
# 语法:
docker start [OPTIONS] CONTAINER [CONTAINER...]
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker kill [OPTIONS] CONTAINER [CONTAINER...]
docker restart [OPTIONS] CONTAINER [CONTAINER...]
docker pause [OPTIONS] CONTAINER [CONTAINER...]
docker unpause [OPTIONS] CONTAINER [CONTAINER...]

docker exec 在运行的容器中执行命令【重要】

语法:docker exec [OPTIONS] CONTAINER COMMAND [ARG…]

1
2
3
4
OPTIONS说明:
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端

eg:
1
docker exec -it 432c029981fa /bin/sh 

Dockerfile

它是用户创建自定义镜像的文件。它通常分为四部分:基础镜像信息,维护者信息,镜像操作指令和容器启动时的指令
eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#基础系统信息,基于ubuntu 14.04构建的  
FROM ubuntu:14.04
MAINTAINER Alex McLain
RUN apt-get -qq update
#安装apache、hg、php5
RUN apt-get -y install apache2 apache2-utils curl mercurial php5 php5-cli php5-mcrypt
# Configure hgweb
ADD hg/add.php /etc/default/hgweb/hg/
#创建一个挂载点,本机或其他容器可以将其挂载。启动时用-v参数进行挂载
VOLUME /var/hg
VOLUME /etc/apache2/sites-available
#暴露的端口号,启动时要通过-p参数指定
EXPOSE 80
#启动时执行的命令
CMD load-default-scripts && service apache2 start && /bin/bash

参数说明:

  • MAINTAINER:设置该镜像的作者。语法:MAINTAINER
  • RUN:在shell或者exec的环境下执行的命令。RUN指令会在新创建的镜像上添加新的层面,接下来提交的结果用在Dockerfile的下一条指令中。语法:RUN 《command》
  • ADD:复制文件指令。destination是容器内的路径。source可以是URL或者是启动配置上下文中的一个文件。语法:ADD 《src》 《destination》
  • CMD:提供了容器默认的执行命令。 Dockerfile只允许使用一次CMD指令。 使用多个CMD会抵消之前所有的指令,只有最后一个指令生效。 CMD有三种形式:CMD [“executable”,”param1”,”param2”],CMD [“param1”,”param2”],CMD command param1 param2
  • EXPOSE:指定容器在运行时监听的端口。语法如下:EXPOSE ;
  • ENTRYPOINT:配置给容器一个可执行的命令,这意味着在每次使用镜像创建容器时一个特定的应用程序可以被设置为默认程序。同时也意味着该镜像每次被调用时仅能运行指定的应用。类似于CMD,Docker只允许一个ENTRYPOINT,多个ENTRYPOINT会抵消之前所有的指令,只执行最后的ENTRYPOINT指令。语法:ENTRYPOINT [“executable”, “param1”,”param2”],ENTRYPOINT command param1 param2
  • WORKDIR:指定RUN、CMD与ENTRYPOINT命令的工作目录。语法:WORKDIR /path/to/workdir
  • ENV:设置环境变量。它们使用键值对,增加运行程序的灵活性。语法:ENV
  • USER:镜像正在运行时设置一个UID。语法:USER
  • VOLUME:授权访问从容器内到主机上的目录。语法:VOLUME [“/data”]

docker-compose

脚本安装

1
2
curl -L https://github.com/docker/compose/releases/download/1.1.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

pip安装

1
pip install -U docker-compose 

docker-compose.yml编写

eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
wiki2:
image: 'nickstenning/mediawiki'
ports:
- "8880:80"
links:
- db:database
volumes:
- /data/wiki2:/data

db:
image: "mysql"
expose:
- "3306"
environment:
- MYSQL_ROOT_PASSWORD=defaultpass

文档:https://docs.docker.com/engine/reference/builder/#dockerfile-examples

执行脚本

1
docker-compose up -d

docker 镜像加速

1
2
3
4
5
6
7
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://oyukeh0j.mirror.aliyuncs.com"]
}
EOF
systemctl restart docker

参考文档

https://www.kancloud.cn/docker_practice/docker_practice/469767
https://docs.docker.com/engine/reference/builder/#dockerfile-examples
https://www.kancloud.cn/hfpp2012/docker/467104