docker使用.md
Docker使用
安装
如果你想以普通用户身份运行docker的话,添加你自己到 docker
警告: 任何加入到 docker 组的用户都和root用户等价. 查阅更多信息可访问 这里 和 这里.
代理
有时因为网络原因,比如公司NAT,或其它啥的,需要使用代理。 Docker的代理配置,略显复杂,因为有三种场景。 但基本原理都是一致的,都是利用Linux的`http_proxy`等环境变量。
dockerd代理 ¶
在执行docker pull时,是由守护进程dockerd来执行。 因此,代理需要配在dockerd的环境中。 而这个环境,则是受systemd所管控,因此实际是systemd的配置。
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo touch /etc/systemd/system/docker.service.d/proxy.conf
在这个proxy.conf文件(可以是任意*.conf的形式)中,添加以下内容:
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080/"
Environment="HTTPS_PROXY=http://proxy.example.com:8080/"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
其中,proxy.example.com:8080要换成可用的免密代理。 通常使用cntlm在本机自建免密代理,去对接公司的代理。 可参考《Linux下安装配置Cntlm代理》。
Container代理 ¶
在容器运行阶段,如果需要代理上网,则需要配置~/.docker/config.json。 以下配置,只在Docker 17.07及以上版本生效。
{
"proxies":
{
"default":
{
"httpProxy": "http://proxy.example.com:8080",
"httpsProxy": "http://proxy.example.com:8080",
"noProxy": "localhost,127.0.0.1,.example.com"
}
}
}
这个是用户级的配置,除了proxies,docker login等相关信息也会在其中。 而且还可以配置信息展示的格式、插件参数等。
此外,容器的网络代理,也可以直接在其运行时通过-e注入http_proxy等环境变量。 这两种方法分别适合不同场景。 config.json非常方便,默认在所有配置修改后启动的容器生效,适合个人开发环境。 在CI/CD的自动构建环境、或者实际上线运行的环境中,这种方法就不太合适,用-e注入这种显式配置会更好,减轻对构建、部署环境的依赖。 当然,在这些环境中,最好用良好的设计避免配置代理上网。
docker build代理 ¶
虽然docker build的本质,也是启动一个容器,但是环境会略有不同,用户级配置无效。 在构建时,需要注入http_proxy等参数。
docker build . \
--build-arg "HTTP_PROXY=http://proxy.example.com:8080/" \
--build-arg "HTTPS_PROXY=http://proxy.example.com:8080/" \
--build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" \
-t your/image:tag
注意:无论是docker run还是docker build,默认是网络隔绝的。 如果代理使用的是localhost:3128这类,则会无效。 这类仅限本地的代理,必须加上--network host才能正常使用。 而一般则需要配置代理的外部IP,而且代理本身要开启gateway模式。
重启生效 ¶
代理配置完成后,reboot重启当然可以生效,但不重启也行。
docker build代理是在执行前设置的,所以修改后,下次执行立即生效。 Container代理的修改也是立即生效的,但是只针对以后启动的Container,对已经启动的Container无效。
dockerd代理的修改比较特殊,它实际上是改systemd的配置,因此需要重载systemd并重启dockerd才能生效。
sudo systemctl daemon-reload
sudo systemctl restart docker
下载 (镜像)
docker默认下载镜像 “https://hub.docker.com/r/”
# docker pull image[:tag]
docker pull centos
docker pull library/centos
查看
docker image ls
# 查看所有容器
docker ps -a
docker ps -a -n=[num] # 最近n个容器
运行 (容器)
# 交互式运行,退出使用 [Ctr]+[p]+[q ]
docker run -it [image] #
# 启动一个已停止的容器
docker start [ID]
# 后台运行容器
docker run -itd --name [name] [image]
# 进入容器
docker exec -it [ID] [/bin/sh] # 新终端
docker attach [ID] # 旧进程
# 参数
# --name "name" 容器名字
# -d 后台运行
# -it 交互
# -p port 指定容器端口
# -p hostport:containerport
# -p ip:hostPort:containerPort
# -e 添加环境变量
搜索
docker search [keyword]
--filter # 过滤
删除
# 删除镜像
docker rmi [ID]
# 删除容器
docker rm [ID]
启动和停止容器
docker start [ID]
docker stop [ID]
docker restart [ID]
docker kill [ID]
日志
docker logs -f -t --tail [num] [ID]
查看容器进程
docker top [ID]
查看镜像元数据
docker inspect [ID]
拷贝容器内文件
docker cp [ID]:[file] [file]
查看cpu状态
docker stats
commit镜像
docker commit -m "comment" -a "author" [ID] [mageName]:[tag]
容器数据卷
目录同步
# 映射
docker run -it -v [hostDir]:[containerDir] [ID]
匿名挂载
docker run -d -P --name [name] -v [volumn]:[contanierFile] [id]
# 默认路径 /var/lib/docker/volumes/
具名挂载
docker run -d -P --name [name] -v [volumn]:[hostFile]:[containerFile]:[ro|rw] [ID]
数据卷容器

docker run -it --name [dtsName] --volume-from [srcName] [id]:[tag]
DockerFile
用来构建Docker文件
步骤:
1. 编写dockerfile
2. docker build 构建为image
3. docker run 测试
4. docker push 发布
指令
- 关键字大写
- # 注释
- 顺序执行
- 每个指令提交新的镜像层
FROM # 基础镜像
MAINTAINER # 维护者信息
RUN # 运行命令
ADD # 添加内容
WORKDIR # 工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口
CMD # 指定容器启动执行命令,只有最后一个生效
ENTRYPOINT # 指定容器启动执行,可追加
ONBUILD # 触发指令,当构建被继承DockerFile运行ONBUILD
COPY #
ENV # 设置环境变量
FROM centos
MAINTAINER nsfoxer<example@ex.ex>
ENV PATH /usr/local/bin
WORKDIR $PATH
RUN yum -y install vim
EXPOSE 80
CMD echo $RANDOM
CMD /bin/bash
构建
docker build -f [dockerfile] -t [name]:[tag] [path]
查看构建过程
docker history [IMAGEID]
发布镜像
docker login
docker push [name]:[tag]
Docker网络
Docker0

所有容器不指定网络时,通过docker0转发。
Docker使用桥接,技术veth-pair。
删除容器,减少一个pair
--link (不建议)
docker run -d -P --name tomcat03 --link tomcat02 tomcat
docker exec -it tomcat03 ping tomcat02 # success
docker exec -it tomcat02 ping tomcat03 # failed
docker network inspect
原理: 修改/etc/hosts映射
自定义网络
容器互联
docker network ls
网络模式
- 桥接 : 0.1 0.2 0.3 0.2与0.3的交互通过0.1 (默认)
- none
- host: 与宿主机共享网络
- container: 容器内互相联通
# 默认
docker run -d -P --name [name] --net bridge [image]
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
docker network inspect mynet
docker run -d --name tomcat_net_1 --net mynet tomcat
# 自定义可以直接ping hostname
网络联通

docker network connect
docker network connect [net-interface] [container]
# 直接将container放入net-interface下
# 即 一个容器两个IP

浙公网安备 33010602011771号