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

修改好以后,重启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,方便容器内运行命令
			
给宿主机配置多个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
			
		
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

			
		
		
		
		
		
		
		
		
		
	
	
			


Powered By Z-BlogPHP 1.7.3

 Theme By 优美模版

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