Docker

Docker

1、docker 简介

​ Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

一个完整的Docker有以下几个部分组成:

​ 1.1 DockerClient客户端

​ 1.2 Docker Daemon守护进程

​ 1.3 Docker Image镜像

​ 1.4 DockerContainer容器

相关概念

概念 说明
Docker 镜像(Images) Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。
Docker 容器(Container) 容器是独立运行的一个或一组应用,是镜像运行时的实体。
Docker 客户端(Client) Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。
Docker 主机(Host) 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker Registry Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
Docker Machine(机器) Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

2、docker 安装

​ 2.1 Docker CE CentOS7 安装

​ 2.1.1 卸载 (首次安装可忽略)

yum remove  docker \
			docker-client \
			docker-client-latest \
			docker-common \
			docker-latest \
			docker-latest-logrotate \
			docker-logrotate \
			docker-selinux \
			docker-engine-selinux \
			docker-engine \
			docker-ce 

​ 2.1.2 安装

1.服务器联网,安装yum 工具
	yum install -y  yum-utils \
					device-mapper-persistent-data \
					lvm2 --skip-broken
2.更新本地镜像源
    vi /etc/docker/daemon.json
{
"registry-mirrors" : [
"https://8xpk5wnt.mirror.aliyuncs.com"
]
}
3.	安装
	yum -y install docker-ce

3、docker 常用命令

1.基础命令
	systemctl start docker  #启动
	systemctl stop docker	#关闭
	systemctl restart docker	#重启
	systemctl enable docker		#开机自启
	systemctl status docker		#查看运行状态
	docker version	#查看版本信息
	docker info		#查看版本信息
2.镜像命令
	docker images #查看docker中镜像列表
	docker images -aq	# -a 显示全部镜像 -q 只显示ID
	
	docker search 镜像名	#搜索镜像
	docker search --filter=STARS=9000 mysql	#搜索 STARS>9000 的 mysql 镜像
	
	docker pull 镜像名		#拉取镜像
	docker pull 镜像名:Tag 	#拉取指定版本镜像不指定版本,默认拉取最新版本
	
	docker run 镜像名		#运行镜像
	docker run 镜像名:Tag 	#运行指定版本镜像
	
	docker rmi -f 镜像名/镜像ID	#删除一个镜像
	docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID	#删除多个镜像,镜像名/ID  空格隔开
	docker rmi -f $(docker images -aq) 	#删除全部镜像
	
	docker save 镜像名/ID -o 路径/名称  # 指定路径名称保存镜像
	
	docker load -i 镜像路径		#加载镜像
	docker tag 源镜像名:版本号 新镜像名:版本号  #镜像标签
	
3.容器命令
	docker ps 	#查看运行容器列表
	docker ps -a	#查看所有容器列表,包含已停止的容器
	
	docker run -it -d --name 容器别名 -p 宿主机端口:容器端口 镜像名:Tag /bin/bash	
	# 运行容器 
	-it 交互式启动
	-d 守护式运行
	--name 给运行容器起个名字
	/bin/bash 交互路径
	-p 指定暴露端口
	--restart=always  # 开机时容器会随着docker服务启动而启动
	-v 宿主机文件位置:容器文件位置	#数据挂载,即将容器内指定文件挂载到宿主机指定文件,-v 可以重复使用,一个容器可以同时挂载多个文件
	
	
	docker exec -it 容器名/容器ID /bin/bash 	#进入容器  进入后exit 直接退出(未添加-d 运行的容器退出后,容器会被关闭) 
	
	docker stop 容器名/容器ID	#停止容器
	docker start 容器名/容器ID 	#启动容器
	docker restart 容器名/容器ID	#重启容器
	
	docker rename 容器名/容器ID 新容器名	#容器改名
	docker commit -m="提交信息" -a="作者信息"  容器名/容器ID 提交后的镜像名:Tag	#提交镜像
	
	docker cp 容器名称/ID:文件路径  外部文件保存路径	# 拷贝容器内文件到外部
	docker cp 外部文件路径  容器名称/ID:文件路径		#拷贝外部文件到容器内
	docker logs -f --taul=30 容器ID	#查看末尾30行,容器日志,默认查看所有日志
	docker system df	#查看docker 磁盘使用情况
	

4、Dockerfile指令详解

FROM:指定基础镜像,定制的镜像都是基于FORM的镜像。

FROM 镜像名称
FROM 镜像名称:版本号

RUN:用于执行后面跟着的命令行,有两种命名方式。

shell格式:
	RUN	命令行   #等同于在 shell 终端 操作 shell 命令

exec格式:
	RUN	["可执行文件","参数1","参数2"]	#等于  ["./test.php","dev","offline"] 等于 [./test.php dev offline]
	
PS: Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。
	FROM centos
	RUN yum -y install wget
	RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
	RUN tar -xvf redis.tar.gz
	
可以简写为
	FROM centos
	RUN yum -y install wget \
    	&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    	&& tar -xvf redis.tar.gz

COPY:复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]

 PS:	[--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。
 		<源路径>:源文件或者源目录,这里可以是通配符表达式。
 		<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

ADD:ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下

​ ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。

​ ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

CMD:类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

​ CMD 在docker run 时运行。

​ RUN 是在 docker build。

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

CMD <shell 命令> 
CMD ["<可执行文件或命令>","<param1>","<param2>",...] 
CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
	推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。

ENTRYPOINT:类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。

优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。

注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

ENV:设置环境变量

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

ARG:构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。

ARG <参数名>[=<默认值>]

VOLUME:定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

​ 避免重要的数据,因容器重启而丢失,这是非常致命的。

​ 避免容器不断变大。

VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

EXPOSE:仅仅只是声明端口。

​ 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。

​ 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

EXPOSE <端口1> [<端口2>...]

WORKDIR:指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

WORKDIR <工作目录路径>

USER:用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

USER <用户名>[:<用户组>]

ONBUILD:用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这时执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。

ONBUILD <其它指令>

LABEL:LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式,语法格式如下

LABEL <key>=<value> <key>=<value> <key>=<value> ...
比如我们可以添加镜像的作者:
LABEL org.opencontainers.image.authors="runoob"

5、Docker构建镜像

docker构建镜像最常用的两种方法

​ 1.通过docker commit 构建镜像

​ 2.通过Dockerfile 构建镜像

​ 以上两种放过制作镜像大致分为3步

a.基于原镜像,启动一个 Docker 容器。在容器中进行一些操作,例如执行命令、安装文件等。
b.由这些操作产生的文件变更都会被记录在容器的存储层中。
c.将容器存储层的变更 commit 到新的镜像层中,并添加到原镜像上。
1.1 通过docker commit 构建镜像
docker commit 参数 容器 镜像名:标签

-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停
2.1 通过Dockerfile 构建镜像
docker build -t regenzm/first_image .     # "."指定的是Dockerfile所在的路径

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
PS:镜像构建时,一定要确保每一层只添加真正需要添加的东西,任何无关的东西都应该清理掉
Dockerfile 编译安装nginx
编写Dockerfile
FROM centos:7            
#	指定原始镜像

ADD nginx-1.22.0.tar.gz /usr/local/src/
#	提前下载好nginx安装包,解压到指定目录
RUN yum -y install  make zlib zlib-devel openssl openssl-devel gcc-c++ gcc libtool pcre \
#	安装常用命令,环境
	&& cd /usr/local/src/nginx-1.22.0	\
#	进入解压后的目录
	&& ./configure --prefix=/usr/local/nginx --with-http_ssl_module	\
#	指定nginx安装目录,--with指定对应模块
	&& make	\
	&& make install	\
#	安装
	&& sed -i '9adaemon off;' /usr/local/nginx/conf/nginx.conf \
#	关闭nginx后的启动
	&& echo "hello Dockerfile" > /usr/local/nginx/html/index.html
#	修改nginx默认页面
EXPOSE 80
#	暴露容器运行时端口
CMD ["/usr/local/nginx/sbin/nginx"]
启动nginx
Docker build 构建镜像
docker build -t 原始镜像ID  新镜像名:TAG . 
运行构建的容器
docker run -d -p80:80 镜像ID        #最后无需加命令,如果跟命令的话,Dockerfile中 CMD 指定的命令不会运行

6、数据管理

Docker容器的分层
Docker镜像是分层设计的,镜像层是只读的,通过镜像启动的容器添加了一层可读写的文件系统,用户写入的数据都保存在这一层中。
LowerDir:image 镜像层(镜像本身,只读)
UpperDir:容器的上层(读写)
MergedDir:容器的文件系统,使用Union FS(联合文件系统)将lowerdir 和upperdir 合并给容器使用
WorkDir:容器在 宿主机的工作目录
查看指定容器的数据分层
docker inspect  12959f2c152f(容器ID)
Docker的数据类型分为两种:
  • 数据卷(data volume):直接使用宿主机目录,数据卷类似于挂载的一块磁盘,数据容器是将数据保存在一个容器上 。
a. 创建数据卷
	docker volume create 数据卷名称
b. 查看所有容器卷 
	docker volume 
c. 查看指定容器卷详细信息
	docker volume inspect 数据卷名称
d. 删除数据卷
	docker volume rm 数据卷名称
e. 绑定数据卷。将数据卷绑定到容器中。将本地的my-vol数据卷挂载到/usr/share/nginx/html目录下。
	docker run -it --name=test-nginx -p 80:80 -v my-vol:/usr/local/nginx/html nginx
  • 数据卷容器(Data volume container):间接使用宿主机空间,数据卷容器是将宿主机的目录挂载至一个专门的数据卷容器,然后让其他容器通过数据卷容器读写宿主机的数据。
#将宿主机目录/var/www挂载到容器中的/data1。
#注意:宿主机本地目录的路径必须是使用绝对路径。如果路径不存在,Docker会自动创建相应的路径。
#-v选项可以在容器内创建数据卷
#挂载多个目录 使用多个 -v 即可
docker run -v /var/www:/data1  -itd centos:7 /bin/bash

7、docker网络

1,简介:容器网络实质上是由 Docker 为应用程序所创造的虚拟环境的一部分,它能让应用从宿主机操作系统的网络环境中独立出来,形成容器自有的网络设备、IP 协议栈、端口套接字、IP 路由表、防火墙等与网络相关的模块。
2,四种网络模式
网络模式 配置 说明
bridge --net=bridge 为每一个容器分配、设置 IP 等,并将容器连接到 docker0 虚拟网桥上,默认
host --net=host 容器不会创建自己的网卡,配置 IP 等,而是使用宿主机的 IP 和端口
container --net=container:容器名称或ID 容器不会创建自己的网卡,配置 IP 等,而是和一个指定的容器共享 IP和端口
none --net=none 关闭网络功能,不进行任何网络设置
2.1 bridge模式

2.2 host模式

2.3 container模式

2.4 none模式

​ 禁用网络功能,只有 lo 接口。

3,docker网络相关命令
docker network  子命令

connect		#连接容器到指定网络
create		#创建网络
disconnect	#断开容器与指定网络的连接
inspect		#显示指定网络的详细信息
ls			#显示所有网络
rm			#删除网络
4,docker跨主机之间互联

​ 4.1,修改各宿主机网段

docker01 宿主机IP:192.168.0.105  
修改docker网段
vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --bip=172.17.1.1/24

docker02 宿主机IP:192.168.0.107
修改docker网段
vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --bip=172.17.2.1/24

​ 4.2,重启容器验证IP

systemctl daemon-reload
systemctl restart docker

docker01

docker02

​ 4.3,添加静态路由 在宿主机操作

docker01

route add -net 172.17.2.0/24 gw 192.168.0.107
iptables -A FORWARD -s 172.17.2.0/24 -j ACCEPT

docker02

route add -net 172.17.1.0/24 gw 192.168.0.100
iptables -A FORWARD -s 172.17.1.0/24 -j ACCEPT
posted @ 2022-10-22 00:00  迎风飘扬的蓝色碎花  阅读(65)  评论(0编辑  收藏  举报