Docker

Docker ip:172.16.3.17

Docker
配置清华大学的docker镜像源
以下内容根据 官方文档 修改而来。
	
如果原来安装过docker-ce需要先移除
	yum remove docker docker-common docker-selinux docker-engine
	
安装一些依赖
	yum install -y yum-utils device-mapper-persistent-data lvm2
	
根据你的发行版下载repo文件: 
	wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
	
把软件仓库地址替换为清华大学国内的镜像源:
	
	sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
	
利yum安装docker
	yum makecache fast
	yum install docker-ce

启动docker
	systemctl start docker.service

设置为开机自启动
	systemctl enable docker.service

查看docker版本
	docker version
返回结果:
Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b
 Built:             Wed Mar 11 01:27:04 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b
  Built:            Wed Mar 11 01:25:42 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

查看docker系统信息
	docker info 
返回结果
Client:
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 19.03.8
 Storage Driver: overlay2
  Backing Filesystem: <unknown>
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-957.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 8
 Total Memory: 7.795GiB
 Name: localhost.localdomain
 ID: Q2PR:QCIS:GBPN:YFIT:OX4I:57DH:4GT2:JYKL:E7F6:MBO2:FPRU:D3HC
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled	

编辑docker的配置文件,启用国内的加速借点
	vim /etc/docker/daemon.json

	{
	"registry-mirrors": ["https://e9yneuy4.mirror.aliyuncs.com"]
	}
	
	或者用国内的
	{
  "registry-mirrors": ["http://hub-mirror.c.163.com","http://hub-mirror.c.163.com","https://registry.docker-cn.com"]
	}

修改好以后,重启docker
	systemctl restart docker.service
	


docker容器常用命令
	
	搜索nginx容器镜像
		docker search nginx
		解释:
		docker search 
		搜索docker容器镜像后面加上容器的名称即可
		
	下载一个nginx容器镜像,默认下载它会下载最新的镜像
	docker pull nginx
	
	再来下载一个alpine镜像,最轻量的linux发行版
	docker pull alpine
	返回结果:
	Using default tag: latest
	latest: Pulling from library/alpine
	cbdbe7a5bc2a: Pull complete 
	Digest: sha256:9a839e63dad54c3a6d1834e29692c8492d93f90c59c978c1ed79109ea4fb9a54
	Status: Downloaded newer image for alpine:latest
	docker.io/library/alpine:latest
	
	下载非官方的docker容器镜像,下载一个163的tomcat
	docker pull hub.c.163.com/library/tomcat:latest
	
	查看当前都有哪些docker容器
	docker image ls
	返回结果
	REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
	alpine                         latest              f70734b6a266        2 weeks ago         5.61MB
	nginx                          latest              602e111c06b6        2 weeks ago         127MB
	hub.c.163.com/library/tomcat   latest              72d2be374029        2 years ago         292MB

	删除一个镜像,可以后面跟名字或者跟ID都可以
	docker image rm hub.c.163.com/library/tomcat
	
	导出一个现有的alpine容器镜像,并且打成一个docker_alpine.tar.gz包,把镜像存到/opt/目录下
	docker image save -o /opt/docker_alpine.tar.gz alpine:latest
	
	或者
	docker image save alpine:latest > docker_alpine.tar.gz 
	
	解释:
		docker image save 
		导出镜像命令
		
		-o
		导出到指定的路径下
		
		
	删除现有的alpine镜像,并再把刚才导出的镜像,导入进来
	先删除
	docker image rm alpine:latest

	再倒入现有的alpine
	docker image load -i /opt/docker_alpine.tar.gz
	
	解释:
		docker image load
		导入镜像命令
		
		-i
		指定导入镜像存放的位置
	再来查看现有的镜像
	docker image ls
	返回结果
	REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
	alpine              latest              f70734b6a266        2 weeks ago         5.61MB
	nginx               latest              602e111c06b6        2 weeks ago         127MB

容器常用操作

	运行一个nginx的docker容器,如果本地没有这个镜像它会去网上下载这个镜像
	docker run -d -p 80:80 nginx
	返回结果:
	
	
	解释:
		docker run
			启动容器
		
		-d
			后台运行
			
		-p
			端口映射,指定docker容器内部端口和宿主机的外部端口
			
		80:80
			外部端口和内部端口
	
		nginx
			容器名称

	启动好以后,可以用浏览打开172.16.3.17,访问一下,可以看到nginx的默认界面	
	http://172.16.3.17/	
	
	下载一个centos6.9的容器镜像
	docker pull centos:6.9
	
	启动centos:6.9并分配一个虚拟终端
	[root@localhost ~]# docker run -it centos:6.9
	返回结果
	[root@52127dea4de7 /]#现在看到这个主机名已经变了
	这个时候已经进入到容器内部里,这里所执行的操作都是在centos:6.9中执行的
	
	解释:
		-it
			给docker容器镜像,分配一个虚拟终端,就跟xshell连接你的服务器的原理是一样的
			
	退出容器内部
	[root@52127dea4de7 /]# exit
	返回结果
	exi
	
	查看运行中的容器
	[root@localhost ~]# docker container ls
	容器运行ID			启动容器的名字			容器初始命令		 	 容器的创建时间		 容器的状态			 端口映射			  名气的名字
	CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
	f0a6aee72bf1        nginx               "nginx -g 'daemon of…"   2 hours ago         Up 2 hours          0.0.0.0:80->80/tcp   frosty_sammet
	
指定centos:6.9的名称,也就是不用系统自带的随机名称
	docker run --name centos6 -d centos:6.9
	
	解释
		--name centos6
			指定容器镜像的名称
	
查看所有的容器,包括运行的和死掉的
	[root@localhost ~]# docker ps ls -a
	返回结果
	CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                NAMES
	58ff49ea8deb        centos:6.9          "/bin/bash"              4 minutes ago       Exited (0) 4 minutes ago                           centos6
	52127dea4de7        centos:6.9          "/bin/bash"              21 minutes ago      Exited (127) 14 minutes ago                        inspiring_easley
	f0a6aee72bf1        nginx               "nginx -g 'daemon of…"   3 hours ago         Up 3 hours                    0.0.0.0:80->80/tcp   frosty_sammet
	d7ae00b3ce74        nginx               "nginx -g 'daemon of…"   3 hours ago         Exited (0) 3 hours ago                             inspiring_matsumot
	这里可以看到centos6	
	
查看容器列表
	docker ps -a

只显示最近一次运行的一个容器
	[root@localhost ~]# docker ps -a -l
	返回结果:
	CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
	58ff49ea8deb        centos:6.9          "/bin/bash"         6 minutes ago       Exited (0) 6 minutes ago                       centos6
	这里我们可以看到,我们手动指定的名称centos6,这样方便后期管理我们的容器

查看运行中的容器
	docker ps
	返回结果:	
	CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
	f0a6aee72bf1        nginx               "nginx -g 'daemon of…"   3 hours ago         Up 3 hours          0.0.0.0:80->80/tcp   frosty_sammet	

停掉nginx的容器	
	[root@localhost ~]# docker container stop f0a6aee72bf1
	这是容器的ID
	f0a6aee72bf1
	
启动刚才停止的容器
	[root@localhost ~]# docker container start f0a6aee72bf1
	f0a6aee72bf1
	
启动一个容器,并进入容器中
	后台启动nginx并指定centos6.9的名称
	docker run  --name nginx -itd -p 81:81 nginx:latest
	
	进入nginx容器内部,并指定sh
	docker exec -it nginx /bin/sh
	
		解释:
			docker exec -it
			给容器分配一个虚拟终端
			
			nginx
			容器的ID或者名称都可以
			
			/bin/sh
			指定容器的sh,方便容器内运行命令
			
	拷贝宿主机的index.html拷贝到容器中去,也就是拷贝到容器的网站发布目录中去
		先来创建一个index.html文件
			echo  test > index.htl
		
		把index.html拷贝到容器中去
			docker cp index.html 8367cc354747:/usr/share/nginx/html/
			
	在宿主机里查看容器中文件
		docker exec 8367cc354747 ls /usr/share/nginx/html
		
	拷贝容器的nginx的默认配置文件到宿主机的/opt目录下
		docker cp 8367cc354747:/etc/nginx/nginx.conf /opt

		
			
给宿主机配置多个IP地址,这样可以让多个docker都能用80,外部访问无需单独加端口
	配置临时IP
		ifconfig eth0:1 172.16.30.223/24 up
		ifconfig eth0:2 172.16.30.225/24 up
		ifconfig eth0:3 172.16.30.227/24 up
		
	多个容器实现同时使用80端口
		docker run -itd -p 172.16.30.223:80:80 nginx:latest
		docker run -itd -p 172.16.30.225:80:80 nginx:latest
		docker run -itd -p 172.16.30.227:80:80 nginx:latest
		
	实现容器172.16.30.223随机端口启动
		dicker run -itd -p 172.16.30.223::80 nginx:latest
		dicker run -itd -p 172.16.30.223::80 nginx:latest
	
	查看随机的端口是多少
		netstat -lntup
			返回结果
				tcp        0      0 172.16.30.225:80        0.0.0.0:*               LISTEN      31375/docker-proxy  
				tcp        0      0 172.16.30.223:80        0.0.0.0:*               LISTEN      31253/docker-proxy  
				tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      5902/sshd           
				tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      5997/master         
				tcp        0      0 172.16.30.223:32768     0.0.0.0:*               LISTEN      32309/docker-proxy  
				tcp        0      0 172.16.30.223:32769     0.0.0.0:*               LISTEN      32419/docker-proxy  
				tcp6       0      0 :::22                   :::*                    LISTEN      5902/sshd           
				tcp6       0      0 ::1:25                  :::*                    LISTEN      5997/master         
				udp        0      0 127.0.0.1:323           0.0.0.0:*                           5560/chronyd        
				udp6       0      0 ::1:323                 :::*                                5560/chronyd 
		
		这里我们可以看到,开始端口是32768,结束的端口60999
				tcp        0      0 172.16.30.223:32768     0.0.0.0:*               LISTEN      32309/docker-proxy  
				tcp        0      0 172.16.30.223:32769     0.0.0.0:*               LISTEN      32419/docker-proxy  
		
		默认docker映射的端口是TCP是协议,如果使用UDP需要加上:udp
			docker run -itd -p 53:53/udp ntpd:latest
			
			
		如果我们容器中要指定多个端口可以用多个-p
			docker run -itd -p 80:80 -p 443:443 nginx:latest
			
		
		使用-P(大P)随机端口
			docker run -itd -P nginx:latest
			
	查看容器的Ip地址,命令后面加上容器的CONTAINER ID号
		docker inspect a79d49695d00|grep -i ipaddr|tail -1|awk -F\" '{print $4}'
		
	批量启动100台nginx容器命令如下
		for i in `seq 0 99`;do docker run -itd -p 80$i:80 nginx ;done
			
	查看100台Nginx容器的IP地址;
		for i in $(docker ps|awk 'NR>1 {print $1}');do docker inspect $i|grep -i ipaddr|tail -1|awk -F\" '{print $4}' ;done
			
	查看100台Nginx容器的ID和IP地址
		for i in $(docker ps|awk 'NR>1 {print $1}');do echo $i; docker inspect $i|grep -i ipaddr|tail -1|awk -F\" '{print $4}' ;done|sed 'N;s/\n/ /g'
			
	查看100台Nginx容器的ID和IP地址,并导出文件
		echo "容器ID,容器IP";for i in $(docker ps|awk 'NR>1 {print $1}');do echo $i; docker inspect $i|grep -i ipaddr|tail -1|awk -F\" '{print $4}' ;done|sed 'N;s/\n/ /g'|sed 's/ /,/g' >>docker_list.csv
	
	手动创建新的容器
		首先下载一个容器
			docker pull ansible/centos7-ansible
			
		启动容器,并映射nginx80:80
			docker run -itd -p 80:80 ansible/centos7-ansible
		
		查看容器的ID
			docker ps -a
			返回结果:
				CONTAINER ID   IMAGE                     COMMAND       CREATED          STATUS          PORTS                                      NAMES
				055a95db   ansible/centos7-ansible   "/bin/bash"   30 minutes ago   Up 30 minutes   0.0.0.0:80->80/tcp, 0.0.0.0:6022->22/tcp   goofy_swirles
				
		进入这台容器安装nginx
			docker exec -it 1357055a95db /bin/bash
		
		进入容器以后编译安装nginx,先来安装所需要的依赖包
			yum install lrzsz gcc make pcre-devel openssl-devel
		
		下载nginx
			wget http://nginx.org/download/nginx-1.18.0.tar.gz
		
		解压nginx
			tar xf nginx-1.18.0.tar.gz
		
		进入nginx目录
			nginx-1.18.0/
			
		添加编译参数
			./configure --prefix=/usr/local/nginx
		
		编译
			make
		
		安装
			make install 
		
		启动
			/usr/local/nginx/sbin/nginx
			
		退出容器
			esxi
			
		生成新的容器,新的容器的名字叫centos7-nginx
			docker commit 1357055a95db centos7-nginx
				
		查看现有的容器
			docker image ls
			返回结果:
			REPOSITORY                TAG       IMAGE ID       CREATED          SIZE
			centos7-nginx             latest    f3027f2c13d2   11 minutes ago   709MB
			ansible/centos7-ansible   latest    688353a31fde   4 years ago      447MB
		
		导出刚才手动创建的容器,导出到/opt/目录下
			docker save -o /opt/centos7-nginx.tar.gz f3027f2c13d2
				
	利用dockerfile一键部署docker容器
		首先创建一个专门存放dockerfile文件的目录
			mkdir -p /data
		
		进入目录
			cd /data
		
		编译一个dockerfile文件
			vim Dockerfile
			写入以下内容
			FROM ansible/centos7-ansible
			MAINTAINER www.9527edu.org
			RUN rm -rf /etc/yum.repos.d/epel*
			RUN echo 123456|passwd --stdin root
			RUN yum install net-tools openssh-server -y
			CMD /bin/bash
			
			解释:
				FROM ansible/centos7-ansible
					FROM指定所创建镜像的基础镜像,这里我指定的是ansible/centos7-ansible这个docker镜像
			
				MAINTAINER www.9527edu.org
					指定维护者信息;
				
			RUN rm -rf /etc/yum.repos.d/epel*
				在容器中执行命令rm -rf /etc/yum.repos.d/epel*
				
			RUN echo 123456|passwd --stdin root
				在容器中执行命令echo 123456|passwd --stdin root
				
				
			RUN yum install net-tools openssh-server -y
				在容器中执行命令yum install net-tools openssh-server -y
				
				
				
				
Docker数据卷
		
	把宿主机的某个文件夹下载的文件拷贝到容器中去,首先先来启动一台nginx容器
		启动一套虚拟机
			docker run -itd -p 80:80 nginx:latest

		准备一个html的小网站,自己生成一个就行了
				echo "text web server" > /opt/index.html
			
		把宿主机下的/opt/index.html拷贝到容器的/usr/share/nginx/html/下
		先来查看容器的ID
			docker ps -a
			返回结果:
				CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
				0102dd74e458        nginx:latest        "/docker-entrypoint.…"   3 minutes ago       Up 3 minutes        0.0.0.0:80->80/tcp   sad_rhodes
		把宿主机下的/opt/index.html拷贝到容器的/usr/share/nginx/html/下
			docker container cp /opt/index.html 0102dd74e458:/usr/share/nginx/html
				
		用宿主机curl一下
			curl 172.16.30.220
			返回结果
			text web server
				
	映射一个宿主机的本地的目录到容器中,这样直接修改本地的数据文件,就可以直接修改容器中的数据库文件,不需要单独进入容器中去修改
		先来创建一个目录
			mkdir -p /data
			
		关闭所有允许中的容器
			docker rm -f `docker ps -a -q`
		
		映射/data/到容器的/usr/share/nginx/html
			docker run -itd -p 80:80 -v /data:/usr/share/nginx/html nginx:latest
				
				-v 映射卷,映射磁盘目录
			
		
		docker卷命令
			docker volume
				create
				
				inspect
					查看卷详细信息

				ls

				prune

				rm
				
	docker映射一个text卷到容器中,如果系统中没有这个卷系统会自动创建
	两个docker容器可以同时挂载一个卷,这样两个容器的内容就一模一样了
	如果卷里面有东西会把,卷里面的内容映射到容器中去
	如果卷里面没有东西会把容器中的内容放到卷里面
		docker run -itd -p 80:80 -v text:/usr/share/nginx/html/ nginx:latest
			
			-v 卷名:容器目录
		
		查看卷的详细信息
			docker volume inspect test
			返回结果	
				[
					{
						"CreatedAt": "2020-07-31T09:01:57+08:00",创建的时间
						"Driver": "local",
						"Labels": null,
						"Mountpoint": "/var/lib/docker/volumes/text/_data",卷存档的目录,后期修改内容可以直接进入这个目录里做修改就行了
						"Name": "text",卷的名称
						"Options": null,
						"Scope": "local"
					}
				]

		查看/var/lib/docker/volumes/text/_data目录
			ls /var/lib/docker/volumes/text/_data
			返回结果
				50x.html  index.html
				
			可以看到这是默认的nginx访问页面文件
			
	总结:docker容器内的第一个进程(初始命令)必须一直处于前台运行的状态(必须夯筑),否则这个容器就会处于退出的状态
	业务在容器中运行:夯筑,启动服务
	
	比如:
		docker run -itd centos:latest
		或
		docker run -d centos:latest tail -f /etc/hosts
		
	
基于nginx启动一个容器,监听80和81,访问80,出现nginx默认欢迎首页,访问81,出现text web server
	先在本地创建一个目录
		mkdir -p /data
	生辰默认首页文件
		echo "text web server" > /data/index.html
	生成nginx配置文件
		vim /opt/text.conf
		
		server {
			listen		81;
			server_name localhost;
			root 		/opt/
			index index.html index.htm;
			location / {
				}
			}
			
			
	启动容器映射端口,并映射目录
		docker run -d -p 80:80 -p 81:81 -v /opt/text.conf:/etc/nginx/conf.d/text.conf -v /data/:/opt/ nginx:latest	
		
		解释:
			-p 80:80 -p 81:81
				容器的80映射到宿主机的80
				容器的81映射到宿主机的81
				多端口映射
				
			-v /opt/text.conf:/etc/nginx/conf.d./text.conf
				把物理机/opt/text.conf映射到容器中/etc/nginx/conf.d./text.conf
				这里映射的路径一定写全路径,也要写上文件名,如何后面只写目录会报错,必须要写上文件名
				
			-v /data/:/opt/
				把物理机的/data/目录映射到容器的/opt/目录下
			
				
	
	第二中方法
		 首先先把所有的容器结束掉
			docker rm -f `docker ps -a -q`
			
		启动容器
			docker run -itd   -p 80:80 -p 81:81 -v /data:/opt nginx:latest
			
		进入容器
			docker exec -it b2080baa3161  /bin/bash

		添加nginx的配置文件
			echo "server {
				listen 81;
					server_name localhost;
					root 		/opt/;
					index index.html index.htm;
					location / {
						}
					}">/etc/nginx/conf.d/test.conf
	
		重启容器
			docker restart b2080baa3161

手动创建容器
	
			
		
		
		
		
Dockerfile

	需求用现有的容器,现有的容器名称叫centos7-ansible然后把一个index.html文件复制到容器的/data/www/html/下,并生成一个新的容器名字叫centos7:v1-1
		创建一个存放dockerfile文件的目录
			mkdir -p /20210318/docker-file
			
		进入这个目录里面
			cd /20210318/docker-file/
		
		在/20210318/docker-file/下创建index.html,并追加内容进里面
			echo <h1>Busybox httpd server.</h1> > /20210318/docker-file/index.html
	
		编辑一个Dockerfile文件,名称一定不能改变首字母要大写
			vim Dockerfile
			添加内容
				FORM centos7-ansible
				MAINTAINER "9527edu <9527@9527edu.org>"
				COPY index.html /data/web/html/
				保存退出
			生成新的容器
				docker image build -t centos7:v1-1 ./
				解释:
					docker image build
						读取dockerfile并生成新的容器
						
					-t centos7:v1-1
						新容器的名称
	
					./
						读取当前目录下Dockerfile文件
						
					FORM centos7-ansible
						读取容器中现有的容器
						
					MAINTAINER "9527edu <9527@9527edu.org>"
						作者介绍,可忽略
						
					COPY index.html /data/web/html/
						把dockfile文件下的index.html 复制到容器的/data/web/html/下,如果容器中此目录不存在会自动创建

	常用指令
		FROM 
			指定现有的容器名称
			
		COPY
			拷贝当前Dockerfile目录里的文件
			COPY <src> <sest>
			COPY ["<src>" "<src>" "<dest>"]
			<src> 要复制的源文件或目录,支持使用通配符
			<dest> 目标路径,既正在创建的image的文件系统路径,建议<dest>使用绝对路径,否则COPY指定则以WORKDIR为起始路径
			文件复制准则
			如果<src>是目录,则其内部文件或子目录会被递归复制,但<stc>目录自身不会被复制·如果指定了多个<src>,
			或在<src>中使用了通配符,则<dest>必须是一个目录,且必须以结尾
			如果<dest>事先不存在,它将会被自动创建,这包括其父目录路径
			例子:
				COPY index.html /www/html/
					解释"
						把当前Dockerfile目录下的index.html复制容器的/www/html/下
		
	
		ADD
			ADD指令类似于COPY命令,ADD支持使用TAR文件和URL路径
			 Syntax
				ADD <src> ...<dest>或·ADD ["<src>".... "<dest>"]·操作准则
				
			同COPY指令
				如果<src>为URL且<dest>不以/结尾,则<src>指定的文件将被下载并直接被创建为<dest>;如果<dest>以/结尾,
				则文件名URL指定的文件将被直接下载并保存为<dest>/<filename>·如果<sc>是一个本地系统上的压缩格式的tar文件,
				它将被展开为一个目录,其行为类似于“tar -x"命令;然而,通过URL获取到的tar文件将不会自动展开
				如果<src>有多个,或其间接或直接使用了通配符,则<dest>必须是一个以/结尾的目录路径﹔如果<dest>不以/结尾则其被视作一个普通文件,
				<src>的内容将被直接写入到<dest>
			
			如果ADD 后面根的是URL,而且是tar文件,则不会展开
				例子:
					ADD http://nginx.org/download/nginx-1.15.2.tar.gz /usr/loca/src/
					
			如果ADD后面跟着是一个tar文件,它会自动解压到你所指定的目录
				例子:
					ADD nginx-1.19.8.tar.gz /usr/local/src/
			
			
		WORKDIR
			指定容器的默认工作目录
			指定一个环境变量
				例子:
					WORKDIR /usr/local/src/
			
			
		LABEL
			制作镜像者,名字和邮箱
			
			
		MAINTAINER
			管理者的信息和LABEL功能一样新版本建议用LABEL
			
			
		ENTRYPOINT
			容器启动的时候执行的初始命令,不能被替换,如果同时使用CMD和ENTRYPOINT,CMD命令将作为ENTRYPOINT命令的参数
			
			
		EXPOST
			要暴露的端口
			
			
		VOLUME
			持久化卷
			
		ENV
			环境变量,(ssh的密码,数据库的密码)给容器里面指定一个环境变量
			
		
			
			
	自己单独构建一个alpine镜像
		原始镜像下载地址
			https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/
			
		这里以alpine为例
			https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/alpine/3.12/amd64/default/20210321_13%3A00/rootfs.tar.xz
			
		创建容器存放的目录
			mkdir -pv /data/dockerfile/{web/{nginx,tomcat,jdk,apache},system/{centos,ubuntu,alpine,debian}}
			
		在centos里把这个镜像下载到你存放dockerfile
			先进入到目录里面
				cd /data/dockerfile/system/alpine/
				
			下载
				wget  https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/alpine/3.12/amd64/default/20210321_13%3A00/rootfs.tar.xz
			
			查看下载的文件
				# ls
				rootfs.tar.xz
				
			创建一个Dockerfile
				vim Dockerfile
				写入以下内容
				FROM scratch
				ADD rootfs.tar.xz /
				CMD ["/bin/sh"]
				
				解释:
					FROM scratch
						重新开始,创建一个初始镜像
						scratch=起跑线,从头开始
						
					ADD rootfs.tar.xz /
						把下载好的rootfs.tar.xz的文件解压到/根下
						
					CMD ["/bin/sh"]
						系统启动命令,这里是启动是[/bin/sh]
			开始构建
				docker build -t alpine:v1 .
					把新创建的alpine名称改成V1
					
	自己单独构建一个centos7镜像
		原始镜像下载地址
			https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/	
			
		这里以centos7为例
			https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/centos/7/amd64/default/
			
		下载centos7的镜像,这里不一定能下载成功
			wget https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/centos/7/amd64/default/20210322_07%3A08/rootfs.tar.xz

			
		查看下载的文件
				# ls
				rootfs.tar.xz
			
			
		创建一个Dockerfile
				vim Dockerfile
				写入以下内容
				FROM scratch
				ADD rootfs.tar.xz /
				CMD ["/bin/bash"]
				解释:
					FROM scratch
						重新开始,创建一个初始镜像
						scratch=起跑线,从头开始
						
					ADD rootfs.tar.xz /
						把下载好的rootfs.tar.xz的文件解压到/根下
						
					CMD ["/bin/sh"]
						系统启动命令,这里是启动是[/bin/bash]
			
			
		开始构建
				docker build -t centos7:v1 .	
			
			
			
	创建自己的镜像
		先来创建目录
		mkdir -pv /data/dockerfile/{web/{nginx,tomcat,jdk,apache},system/{centos,ubuntu,alpine,debian}}
			
		创建一个基础镜像
			进入到centos目录
				cd /data/dockerfile/system/centos/
				
			创建一个Dockerfile
				vim Dockerfile
				写入以下内容
				RUN yum install epel* -y && yum install lrzsz gcc gcc-c++ automake pcre-devel make  openssl-devel zlib zlib-devel iproute net-tools iotop unzip -y
				RUN groupadd www -g 2020 && useradd www -u 2020 -g www && groupadd nginx -g 2021 && useradd nginx -u 2021 -g nginx
			
			创建镜像
				docker build -t centos7test:v1 .
			
			
		创建jdk8U261的容器基于centos7test:v1
			先进入目录/data/dockerfile/web/jdk/
				cd /data/dockerfile/web/jdk/
			
			创建jdk相关版本的目录
				mkdir /data/dockerfile/web/jdk/jdk-8u261 -p
				
			进入刚创建的目录
				cd /data/dockerfile/web/jdk/jdk-8u261
				
			上传jdl8u261的tar包,根据自己的喜欢上传
				ls jdk-8u261-linux-x64.tar.gz
				
			需要准备一个fprofile文件
			先来把jdk-8u261-linux-x64.tar.gz解压到/usr/local/src/下
				tar -xf jdk-8u261-linux-x64.tar.gz  -C /usr/local/src/
			创建软连接
				ln -s /usr/local/src/jdk1.8.0_261/ /usr/local/jdk
				
			添加宿主机的环境变量,不是容器的
				vim /etc/profile
				最后一行添加如下内容
				export JAVA_HOME=/usr/local/jdk
				export PATH=$JAVA_HOME/bin:$PATH
				export CLASSPATH=.:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
				export PATH JAVA_HOME CLASSPATH
				保存退出
			
			让宿主机的环境变量生效
				. /etc/profile
				
			宿主机查看
				java -version
				返回结果
					java version "1.8.0_261"
					Java(TM) SE Runtime Environment (build 1.8.0_261-b12)
					Java HotSpot(TM) 64-Bit Server VM (build 25.261-b12, mixed mode)

			把宿主机的/etc/profile拷贝到/data/dockerfile/web/jdk/jdk-8u261/下
				cp /etc/profile /data/dockerfile/web/jdk/jdk-8u261/
				
			在/data/dockerfile/web/jdk/jdk-8u261/下创建Dockfile
				cd /data/dockerfile/web/jdk/jdk-8u261/
				vim Dockerfile
				写入以下内容
				FROM centos7test:v1
				ADD jdk-8u261-linux-x64.tar.gz /usr/local/src/
				RUN ln -sv /usr/local/src/jdk1.8.0_261 /usr/local/jdk
				ADD profile /etc/profile
				
				ENV JAVA_HOME /usr/local/jdk
				ENV JRE_HOME $JAVA_HOME/jre
				ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib
				ENV PATH $PATH:$JAVA_HOME/bin
				RUN rm -rf /etc/localtime && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
				
				生成新的容器
					docker build -t centos7-jdk:8u261 .
				
				
				解释:
					FROM centos7test:v1
						初始容器名称
						
					ADD jdk-8u261-linux-x64.tar.gz /usr/local/src/
						把本地的ADD jdk-8u261-linux-x64.tar.gz解压到/usr/local/src/
						
					RUN ln -sv /usr/local/src/jdk1.8.0_261 /usr/local/jdk
						创建软连接
						
					ADD profile /etc/profile
						把本地的profile复制到/etc/profile
				
					
					ENV JAVA_HOME /usr/local/jdk
				    ENV JRE_HOME $JAVA_HOME/jre
				    ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib
				    ENV PATH $PATH:$JAVA_HOME/bin
						让系统调用java的环境变量,默认root不会读取/etc/profile里的环境变量
						
					RUN rm -rf /etc/localtime && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
						删除掉默认的时区,把亚洲上海的文件软连接文件到/etc/localtime
						
					
				
		创建tomcat-8.5.64的容器基于centos7-jdk:8u261
			进入到tomcat目录里
				cd /data/dockerfile/web/tomcat
				
			创建tomcat8的目录
				mkdir -p /data/dockerfile/web/tomcat/tomcat8-base
			
			进入这个目录里
				cd /data/dockerfile/web/tomcat/tomcat8-base
			
				
			下载tomcat
				wget https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-8/v8.5.64/bin/apache-tomcat-8.5.64.tar.gz
				
			编辑一个dockerfile文件
				vim Dockerfile
				写入以下内容
				FROM centos7-jdk:8u261
				ADD apache-tomcat-8.5.64.tar.gz /usr/local/
				RUN ln -sv /usr/local/apache-tomcat-8.5.64 /usr/local/tomcat
				
			生成tomcat8-base容器
				docker build -t tomcat8-base:v1 .
		
		创建tomcat容器,先来应用目录
			创建目录
				mkdir -p /data/dockerfile/web/tomcat/tomcat-app1
			进入目录
				cd /data/dockerfile/web/tomcat/tomcat-app1
				单独准备一个server.xml
				可以把从别的主机上拷贝一个或者解压tomcat的包,复制出来也可以,我这里直接解压tomcat的包,然后复制出来
					解压
						tar -xf apache-tomcat-8.5.64.tar.gz -C /usr/local/
					复制到当前目录
						cp /usr/local/apache-tomcat-8.5.64/conf/server.xml /data/dockerfile/web/tomcat/tomcat-app1/
						
					创建一个测试页面
						先来创建一个目录存放测试页面
							mkdir -p /data/dockerfile/web/tomcat/tomcat-app1/test/
						
						创建一个html文件
							echo test web1 page > /data/dockerfile/web/tomcat/tomcat-app1/test/index.html
						
						打包文件
							先进入目录 
							cd /data/dockerfile/web/tomcat/tomcat-app1/
							
							再来打包
							tar -czvf  /data/dockerfile/web/tomcat/tomcat-app1/web1.tar.gz test/*
					
				编辑server.xml
					vim server.xml
					这里只是简单的修改以下,可以根据自己的实际需求修改做相应的优化
					修改的内容
					未改
						<Host name="localhost"  appBase="webapps"
							  unpackWARs="true" autoDeploy="true">
					改后
						<Host name="localhost"  appBase="/data/web/webapps"
						      unpackWARs="false" autoDeploy="false">
					
					解释:
						appBase="appBase="/data/web/webapps
							把网站源码目录放到容器中的appBase="/data/web/webapps/下
						unpackWARs="false"
							不自动解压war包
							
						autoDeploy="false
							不自动部署
				
				编写一个run_tomcat.sh启动脚本,方便tomcat在容器中启动
				可以写一下其他的命令非交互式的比如host解析或者dns的修改
					vim run_tomcat.sh
					写入以下内容
					#!/bin/bash
					#echo "172.16.3.1 dns1.9527edu.org" >> /etc/hosts
					#echo "172.16.3.2 dns2.9527edu.org" >> /etc/hosts
					echo "nameserver 223.5.5.5" > /etc/resolv.conf
					su - www -c "/usr/local/tomcat/bin/catalina.sh start"
					tail -f /etc/hosts
					解释:
						#echo "172.16.3.1 dns1.9527edu.org" >> /etc/hosts
						#echo "172.16.3.2 dns2.9527edu.org" >> /etc/hosts
							修改本地hosts解析
							
						echo "nameserver 223.5.5.5" > /etc/resolv.conf
							修改本地dns指向地址
						
						su - www -c "/usr/local/tomcat/bin/catalina.sh start"
							切换到www用户,并用www用户启动tomcat
						
						tail -f /etc/hosts
							一守护进程方式运行,不怕服务当掉
				给run_tomcat.sh一个执行权限否则在容器中无法执行没因为没有权限执行
					chmod a+x run_tomcat.sh
				
				编译一个dockerfile文件
					vim Dockerfile
					写入以下内容
					FORM tomcat8-base:v1
					ADD server.xml /usr/local/tomcat/conf/server.xml
					ADD web1.tar.gz /data/web/webapps
					RUN chown -R www.www /usr/local/tomcat/
					ADD run_tomcat.sh /usr/local/tomcat/bin/run_tomcat.sh
					EXPOSE 8080 8005 8009
					CMD ["/usr/local/tomcat/bin/run_tomcat.sh"]
						
			生成新的容器
				docker build -t tomcat-app1:v1 .
				
			启动容器
				docker run -itd -p  8080:8080 tomcat-app1:v1

		
		创建Tomcat-7.0.82的容器基于centos7:v1
			创建目录
				mkdir -p /data/dockerfile/web/tomcat/tomcat7
				
			进入目录
				cd	/data/dockerfile/web/tomcat/tomcat7
		
			将jdk7和tomcat7安装包放入tomcat7
				#ls
				apache-tomcat-7.0.82.tar.gz  jdk-7u80-linux-x64.tar.gz
				
			编写Dockerfile文件
				vim Dockerfile
				写入以下内容
				FROM centos7:v1
				#上传
				ADD apache-tomcat-7.0.82.tar.gz /opt/tomcat
				ADD jdk-7u80-linux-x64.tar.gz /opt/jdk
				COPY /run.sh /root/run.sh
				RUN  chmod 777 /root/run.sh
				#环境变量
				ENV JAVA_HOME=/opt/jdk/jdk1.7.0_80/jre
				ENV PATH=:$JAVA_HOME/bin:$PATH
				ENV CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
				ENTRYPOINT ["/root/run.sh"]
			
			编写run.sh启动脚本
				vim run.sh
				写入以下内容
				#!/bin/bash
				sh /opt/tomcat/apache-tomcat-7.0.82/bin/catalina.sh run
				
			生成新的容器
				docker build -t tomcat:7 .
				
			
	
	基于alpine创建一个nginx的容器
		先来创建目录
			mkdir -p /data/dockerfile/web/nginx-alpine
			
		进入目录
			cd /data/dockerfile/web/nginx-alpine
			
		编写Dockerfile文件
			vim Dockerfile
			写入以下内容
			FROM alpine:v1
			#RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
			RUN apk add iotop gcc libgcc libc-dev libcurl libc-utils  pcre-dev zlib-dev libnfs make pcre pcre2 zip unzip net-tools pstree wget libevent libevent-dev iproute2
			ADD nginx-1.18.0.tar.gz /usr/local/src
			ADD nginx.conf /usr/local/nginx/conf/nginx.conf
			ADD v1.conf /usr/local/nginx/conf.d/
			RUN echo test web-nginx-alpine page > /usr/local/nginx/html/index.html
			RUN cd /usr/local/src/nginx-1.18.0/ && ./configure --prefix=/usr/local/nginx && make && make install && ln -s /usr/local/nginx/sbin/ng
			inx /usr/sbin/
			EXPOSE 80 443
			CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
		
		准备nginx主配置文件
			vim nginx.conf
			写入以下内容
			worker_processes  1;
			events {
				worker_connections  1024;
			}
			http {
				include       mime.types;
				default_type  application/octet-stream;
				sendfile        on;
				keepalive_timeout  65;
				include /usr/local/nginx/conf.d/*.conf;
				}
		
		准备虚拟主机文件
			server {
			listen       80;
			server_name  localhost;
			location / {
				root   html;
				index  index.html index.htm;
			}
			#   location /app1 {
			#		proxy_pass http://172.16.30.222:8080;
			#       }
			error_page   500 502 503 504  /50x.html;
			location = /50x.html {
				root   html;
				}
			}	

		下载nginx-1.18.0源码包
			wget http://nginx.org/download/nginx-1.18.0.tar.gz
			
		生成新的容器
			docker build -t alpine-nginx:v1 .
	
	基于ubuntu创建一个nginx的容器
		先来来创建目录
			mkdir -p /data/dockerfile/web/nginx-ubuntu
					
		
				
				
				
			


Powered By Z-BlogPHP 1.7.3

 Theme By 优美模版

本博客为开源博客,本博客联系QQ:372097243