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
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 -ndocker 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}