Docker

目录

1 基本

1.1 交互式启动

docker run -ti …

1.2 指定容器名

docker run –name …

1.3 重启动

docker start container

1.4 运行中交互

  • docker attach container
  • docker exec -t -i container /bin/bash

1.5 守护进程启动

docker run -d

1.6 logs

1.6.1 跟踪日志

docker logs -f container

1.6.2 限制最后 n 条

docker logs –tail n -f container

1.6.3 log driver

docker run –log-driver="syslog" …

1.7 stats

docker stats container1 container2 …

1.8 exec [command]

docker exec -d container [command]
docker exec -t -i container /bin/bash

1.9 自动启动/自动重启

docker run --restart=always --name daemon_dave -d ubuntu /
 bin/sh -c "while true; do echo hello world; sleep 1; done"
docker container update --restart=always [container]

其他选项,例如:退出代码为非 0 时,Docker 会尝试自动重启,最多重启 5 次: –restart=on-failure:5

1.10 docker top, docker ps

docker top 查看容器运行情况 docker ps -a 可列出所有容器(包括未运行的容器)

1.11 查看镜像/容器详细信息

docker inspect container/image

1.12 端口映射

# 绑定端口
docker run -p [outer_port]:[inner_port]
docker run -P #遵循 Dockerfile EXPOSE
# 查看端口映射
docker ps -l
docker port container inner_port

1.13 删除全部容器

docker rm `sudo docker ps -a -q`

2 镜像

  • docker pull [user/]repo[:tag]
  • docker push [user/]repo[:tag]
  • docker images
  • docker search

2.1 创建镜像

2.1.1 login

docker login

2.1.2 commit

docker run -ti image_to_modify /bin/bash
# modify in container
docker commit container user/repo -m "comment" -a "User Name"

2.1.3 Dockerfile

例子:

# Version: 0.0.1 
FROM ubuntu:14.04 
MAINTAINER XXX "xxx@xxx.com"
ENV REFRESHED_AT 2017-07-01 #表明该镜像模板最后的更新时间,Docker 在命中 ENV 指令时开始重置这个镜像缓存
RUN apt-get update && apt-get install -y nginx 
RUN echo 'Hi, I am in your container' \
   >/usr/share/nginx/html/index.html 
EXPOSE 80 #只是给外界看的,具体使用哪个端口在 run 时指定,或使用 docker run 的-P 选项生效

RUN 指令默认会在 shell 里使用命令包装器/bin/sh -c 来执行。exec 格式 RUN 指令:

RUN [ "apt-get", " install", "-y", "nginx" ]
docker build -t [username]/[image_name]:[tag]

2.1.4 docker build

docker build -t="user/repo:tag" Dockerfile 一般放在项目根目录,指定 Dockerfile 路径使用-f 选项 .dockerignore 指定忽略文件。

2.1.5 docker history

查看构建过程

2.2 Dockerfile 指令集

2.2.1 CMD

指定容器启动时运行的命令,docker run 末尾的命令如果与 CMD 指定的重叠,则 CMD 中的不会运行

2.2.2 ENTRYPOINT

可使与 docker run 末尾的重复命令不生效

2.2.3 WORKDIR

2.2.4 ENV

ENV 指令用于在容器中永久的建立环境变量

ENV MYENV1=XXX MYENV2=XXX TARGET_DIR=/opt/app
WORKDIR $TARGET_DIR

2.2.5 USER

指定用户运行镜像

USER user/uid
USER [user/uid]:[group/gid]

2.2.6 VOLUME

VOLUME 指令用来向基于镜像创建的容器添加卷

  • 卷可以在容器间共享和重用
  • 一个容器可以不和其他容器共享卷
  • 对卷的修改是立时生效的
  • 对卷的修改不会对更新镜像产生影响
  • 卷会一直存在直到没有任何容器再使用它
VOLUME ["/opt/project"]
VOLUME ["/opt/project", "/data" ]

2.2.7 ADD

2.2.8 COPY

2.2.9 LABEL

2.2.10 STOPSIGNAL

2.2.11 ARG

2.2.12 ONBUILD

2.3 推送镜像

先登录 docker login,docker push 推送镜像到 docker hub

  • 自动推送

    为了使用自动构建,我们只需要将 GitHub 或 BitBucket 中含有 Dockerfile 文件的仓库连接到 Docker Hub 即可。 向这个代码仓库推送代码时,将会触发一次镜像构建活动并创建一个新镜像。

2.4 删除镜像

docker rmi

  • 全部删除

    docker rmi `docker images -a -q`

2.5 自建 Registry

2.5.1 部署

docker run -p 5000:5000 registry

2.5.2 上传 image 到 registry

docker tag image_id registry_host:registry_port/user/repo:tag

2.5.3 运行 registry 中的镜像

sudo docker run -t -i host:port/user/repo:tag /bin/bash

3 建立连接

3.1 Docker 内部网络

  • ip a show docker0: show docker0 interface
  • 接口 docker0 是一个虚拟的以太网桥,用于连接容器和本地宿主网络
  • 每个容器都有一个接口,一端连接容器里的 eth0 接口,另一端为在宿主机上的 veth****接口。veth****直接连上 docker0 网桥
  • sudo iptables -t nat -L -n
  • docker inspect container

最大的问题在于容器重启会改变 IP

3.2 Docker Networking

docker network create app # 创建
docker network inspect app # 查看

docker network ls # list

使用 --network 参数指定容器运行网络

3.2.1 已有容器网络操作

docker network connect app container1
docker network disconnect app container1

3.3 Docker Link

  • --link targetname:alias: try ping alias in container
  • 容器内新增环境变量 ALIAS_NAME, ALIAS_PORT

4 Docker Machine

快速创建一个虚拟 docker 主机

5 Docker Compose

6 Docker Swarm

6.1 Node

6.2 Task

6.3 Service

docker service create

mode: replicated, global

6.4 work with compose

docker stack

  • show errors before running container: docker service ps --no-trunc {serviceName}