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

这个是用户级的配置,除了proxiesdocker 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容器的数据卷(data volume),数据卷容器,数据卷的备份和还原。 - 哈哈呵h - 博客园

docker run -it --name [dtsName] --volume-from [srcName] [id]:[tag]

DockerFile

​ 用来构建Docker文件

​ 步骤:

	1. 编写dockerfile
	2. docker build 构建为image
		3. docker run 测试
  		4. docker push 发布

指令

  1. 关键字大写
  2. # 注释
  3. 顺序执行
  4. 每个指令提交新的镜像层
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虚拟网卡的veth pair的配对- bjtime - 博客园

所有容器不指定网络时,通过docker0转发。

Docker使用桥接,技术veth-pair。

删除容器,减少一个pair

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

网络联通

image-20201210113603422

docker network connect

docker network connect [net-interface] [container]
# 直接将container放入net-interface下
# 即 一个容器两个IP
posted @ 2022-05-28 17:40  nsfoxer  阅读(66)  评论(0)    收藏  举报