Linux科技

Docker

2018-06-08  本文已影响2人  Miracle001
docker分层
安装lamp
httpd image
httpd+php image
myqsl image
基于现有的镜像,创建/更新新的镜像
共用一个镜像,节约了镜像存储空间
删除时,不是真的删除,仅仅是隐藏,性能低

aufs: 高级多层统一文件系统--实现联合挂载
Ubuntu支持aufs
CentOS7支持devicemapper
类似功能的产品是overlayfs--linux内核支持
docker architecture
Docker Host and Registry
一个仓库-->一个应用的不同版本--镜像版本,不是程序版本
不同仓库--不同版本
镜像文件可不放在registry上--所需要仅是存储空间--可放在亚马逊的S3上
  本地的文件系统  分布式的外部文件系统  公有云
  找镜像--registry的index记录镜像放在哪里
docker转移功能
docker的容器
  运行单一程序/进程(可以有子进程、子子进程)
  进程前台运行
  程序+依赖环境(库)--便于移植的(虽然额外多了库空间,但是收益大于损失)
写操作
  保存在容器外部的文件系统上--卷
  完成操作后,可以删除容器,下次使用,加载外部文件系统上的载镜像即可
Tomcat
  安装jdk、安装Tomcat、第三方类库、APP
  建立自己的镜像--不需要外部环境--其他机器需要类似功能,只需要pull image到本地即可

docker event state
CentOS Docker 安装
uname -r  3.10.0-693.el7.x86_64
yum list docker*
yum info docker
yum -y install docker
rpm -ql docker|less
systemctl start docker
ifconfig  显示docker0--桥
docker version
docker info

镜像加速
vim /etc/docker/daemon.json
{
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}
systemctl restart docker
-----------------------------------------------------------------------
docker pull -h
Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker rmi --help
Usage:  docker rmi [OPTIONS] IMAGE [IMAGE...]
docker rm --help
Usage:  docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker run --help
Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  -t: 在新容器内指定一个伪终端或终端
  -i: 允许你对容器内的标准输入 (STDIN) 进行交互
  --name="nginx-lb": 为容器指定一个名称
基于容器、镜像自定义
-----------------------------------------------------------------------
Docker Hub网站:https://hub.docker.com/explore/
搜索busybox

docker search busybox
docker pull busybox(:latest)  默认就是安装tags为latest的busybox镜像
docker run --name bbox1 -i -t busybox
docker images --digests
docker images
docker ps
ifconfig  IP地址为172.17.0.2
ping www.qq.com  ok
docker stop bbox1
docker start bbox1
docker run --rm --name bbox2 busybox 'ifconfig'  运行完ifconfig后,直接删除bbox2容器

docker run --name ubuntu_fgq -i -t ubuntu /bin/bash  不用pull,可以直接run=pull+start
docker images
docker ps -a
docker ps -l 
docker ps 
docker stop ubuntu_fgq
docker rm ubuntu_fgq  删除容器
docker rmi ubuntu  删除镜像

docker search redis
docker run --name redis_fgq -it redis  此处的 -it=-i和-t
docker images
docker ps -a
docker inspect redis_fgq  探测内部详细信息;"IPAddress": "172.17.0.2"
node1节点
  yum -y install redis
  redis-cli -h 172.17.0.2
  set mykey hello
  get mykey
docker stop redis_fgq
docker rm redis_fgq

docker search tomcat
docker run --name tomcat_fgq -it tomcat
docker images
docker ps -a
docker inspect tomcat_fgq  "IPAddress": "172.17.0.2"
node1的图形界面
  firefox
  172.17.0.2:8080  ok
IE、Google浏览器不能访问--(桥接至网桥、ip地址转发)

阿里docker镜像
创建
管理
操作指南
镜像的生成途径
https://cr.console.aliyun.com/#/imageList  
注册后使用账号和密码登录
内含镜像加速器
如上图显示

centos命令行操作
ali-docker
docker login --username=qiang18240652107 registry.cn-hangzhou.aliyuncs.com
docker-hub
docker login --username=qianggedu https://registry-1.docker.io/qianggedu
  输入密码即可显示Login Succeeded
docker login  然后直接输入账号和密码也可以

docker search zabbix
docker pull docker.io/zabbix/zabbix-agent

docker save  --help
docker load --help
docker push --help
docker save -o /root/busybox-1.28.4.tar busybox
scp /root/busybox-1.28.4.tar node3.fgq.com:/root/  或者使用ftp服务器
node3(安装过docker)
docker load -i /root/busybox-1.28.4.tar
docker images
docker tag busybox:latest busybox:1.28.4
  新的镜像1.28.4仍然在busybox仓库里
docker tag busybox:latest registry.cn-hangzhou.aliyuncs.com/fgq/busybox:1.28.4
  新的镜像1.28.4在registry.cn-hangzhou.aliyuncs.com/fgq/busybox仓库里
指明哪个仓库的哪个tag,这样才可以推到目标仓库里面
建议一个仓库对应一个程序
docker images
docker push registry.cn-hangzhou.aliyuncs.com/fgq/busybox:1.28.4
显示完成后登陆阿里云镜像界面--显示版本如下图镜像版本


docker ps -a  没有容器启动
docker commit --help
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
基于busybox镜像创建一个新的镜像,内含测试页面
docker run --name bbox1 -i -t busybox
进入交互界面后
mkdir -pv /data/web/html
vi /data/web/html/index.html
<h1>Test Page @docker container</h1>
docker commit -p -a "fgq <fgq@qianggedu.com>" bbox1 registry.cn-hangzhou.aliyuncs.com/fgq/busybox:data
  -p  暂停正在运行的容器--bbox1
  -a  指明作者和邮箱
docker images
docker push registry.cn-hangzhou.aliyuncs.com/fgq/busybox:data
node3
如果是公开的仓库--不用登陆即可pull内容;
如果是私有的仓库--需要登陆才可以pull内容;
docker pull registry.cn-hangzhou.aliyuncs.com/fgq/busybox:data
docker images
docker run --name data -i -t registry.cn-hangzhou.aliyuncs.com/fgq/busybox:data
cat /data/web/html/index.html


提交镜像时,修改默认运行的命令
docker commit -p -a "fgq <fgq@qianggedu.com>" bbox1 -c 'CMD ["httpd","-f","-h","/data/web/html"]' registry.cn-hangzhou.aliyuncs.com/fgq/busybox:httpd
  -f  后台运行
  -h  指明家目录
docker images
docker run --name httpd -d registry.cn-hangzhou.aliyuncs.com/fgq/busybox:httpd
  -d  后台运行
docker ps -a  处于up状态
docker inspect httpd
curl http://172.17.0.3
docker pull registry.cn-hangzhou.aliyuncs.com/fgq/busybox:httpd
docker kill httpd
docker rm httpd

镜像版本
卷--容器上的一个、多个目录
dockre ps -a
docker rm bbox1
docker run --name bbox1 -it -v /data/mysql docker.io/busybox:latest
  -v /data/mysql  容器目录,不存在,会自动创建,并挂载至后端/宿主机的目录(自动生成,不用关心)
bbox1命令行:
ls /data/mysql
cp /etc/hosts /data/mysql
ls /data/mysql

centos命令行:
docker inspect bbox1  "Mounts"中的"Source"--宿主机的文件路径、"Destination"
ls "Source"的文件路径
vim "Source"的文件路径/hosts
192.168.1.7  node1.fgq.com

bbox1命令行:
cat /data/mysql/hosts  显示出刚才添加的node1信息

docker volume --help 
docker volume ls 
ls /var/lib/docker/volumes/
docker rm -v bbox1
ls /var/lib/docker/volumes/  少了一个
mkdir -pv /data/docker/volumes/html
docker run --name bbox1 -it -v /data/docker/volumes/html:/data/web/html docker.io/busybox:latest
ls /data/web/html  没有内容
宿主机上:
cd /data/docker/volumes/html
vim index.html
<h1>New Page</h1>
bbox1容器内
cat /data/web/html/index.html
以上是绑定卷

docker ps -a
docker exec --help  探查容器内的属性
docker exec httpd ls /data/web/html
docker run --name myhttpd -d -v /data/docker/volumes/html/:/data/web/html/ registry.cn-hangzhou.aliyuncs.com/fgq/busybox:httpd
  容器httpd内/data/web/html下的文件被宿主机覆盖
docker ps  显示myhttpd的程序已经运行
docker inspect myhttpd  显示ipaddress--172.17.0.2
curl 172.17.0.2


容器1和2公用一个文件系统路径
复制使用其他容器的卷
先创建第一个容器,再从第一个容器复制卷到第二个容器
docker ps -a 
docker inspect myhttpd  观察"Mounts"内容
docker run --name bbox3 -it --volumes-from myhttpd docker.io/busybox:latest
默认此镜像里面没有data内容
此时的bbox3的命令行界面:
cat /data/web/html/index.html    显示有内容
docker inspect myhttpd  
docker inspect bbox3  显示二者的内容相同,使用同一个宿主机上的文件
以上类似--数据卷容器--其他容器以此容器的卷为基础,创建新的容器;
  即使删除了容器,之后再启动,只需要从数据卷容器复制卷后启动容器即可;
  如下图数据卷

docker inspect --help
docker inspect docker.io/busybox:latest
docker inspect myhttpd
docker inspect -f {{.Mounts}} myhttpd
docker inspect -f {{.NetworkSettings.Networks}} myhttpd
docker inspect -f {{.NetworkSettings.Networks.bridge}} myhttpd

docker run --name bbox4 -it docker.io/busybox:latest
exit  退出终端,程序终止
ctrl+p;ctrl+q  剥离终端,程序仍然运行
docker ps -a
docker attach --help
docker attach bbox4  重新连接至某个正在运行的终端

数据卷
网络
node1--192.168.43.82
docker network --help
ifconfig  docker0--172.17.0.1
docker network ls
  bridge  默认  docker0
  host
  none  没有网络
docker network inspect bridge  显示bridge网络定义的详细信息
dockerd -h
  -b  桥网络
  -bip  桥IP
docker search busybox
docker run --name bbox1 -it docker.io/busybox
交互界面
  ifconfig  eth0--172.17.0.2
  ping 172.17.0.1  ok
  ping 192.168.43.82  ok
  ping 192.168.43.1  ok  源地址转换
  ping www.qq.com  ok

node2
ping 172.17.0.2  no

node1
使用dnat
外部访问公网地址--192.168.43.82,不是访问内网的172.17.0.2

联盟式容器
httpd--lo--mysql--共享一个网卡
外部可以访问httpd,httpd在通过127.0.0.1:3306访问MySQL
httpd+php+mariadb server
联盟式容器解决了这个问题-->docker--一个容器只有一个进程
k8s中的Pod就是这个原理

node1
交互界面
exit
docker rm bbox1
docker run --name cc1 -it --network none docker.io/busybox
交互界面
  ifconfig -a  只有本地回环接口lo
exit
docker rm cc1
docker run --name fc -it --network bridge docker.io/busybox
  fc--第一个容器  sc--第二个容器
交互界面
  ifconfig -a  有桥接eth0和回环lo
  hostname  
centos命令行
docker run --name sc -it --network container:fc docker.io/busybox
  --network container:fc  指明开启的sc容器共享fc容器的网络
交互界面
  ifconfig -a  与fc相同
  hostname  主机名一样,IP地址一样的原因
  可以run运行时,设置主机名:--hostname node11.fgq.com
关闭
fc1界面:exit
sc1界面:exit
docker rm fc sc

6个名称空间
2个是共享的--UTS、network
4个是隔离的

node1
ifconfig  ens33--192.168.43.82
docker run --name hc -it --net host docker.io/busybox
  hc--宿主机
  --net host  使用宿主机的网络名称空间  --net=--network
交互界面
  ifconfig -a  与宿主机网络相同,不建议使用
  exit
docker rm hc

docker run --help
  -h, --hostname string  指明主机名
  --dns list
  --dns-search list  默认dns
  --add-host list  添加/etc/hosts解析记录,可以添加多个
docker run --name bbox1 -it --net bridge --hostname bbox1.fgq.com --dns 192.168.43.1 --add-host www.fgq.com:192.168.43.1 --add-host ftp.fgq.com:192.168.43.2 docker.io/busybox
交互界面
  cat /etc/hosts
  cat /etc/resolv.conf
  hostname
  显示出自己的设置

实现自己net背后的容器可以被外部访问
dnat
宿主机80--映射到--第一个虚拟机
宿主机90--映射到--第二个虚拟机
后台2个容器都是nginx
  只有一个IP地址:一个用80端口,一个用非标准端口
  多个IP地址:ip1:80  ip2:80
映射--相同概念:发布or端口暴露EXPOSE
node1
bbox1的交互界面
  mkdir -pv /data/web/html
  vi /data/web/html/index.html
    <h1>Container Web Site</h1>
  httpd -h
  httpd -f -h /data/web/html/  看日志
centos界面
  curl http://172.17.0.2  可以访问--因为宿主机有172.17.0.1的网段
node2此时不能访问
node1
bbox1的交互界面
  ctrl+c
  exit
  docker rm bbox1

node1
mkdir -pv /data/docker/volumes/html/  做为卷容器
cd /data/docker/volumes/html
vim index.html
<h1>Test Page</h1>
docker run --name bbox1 -it --net bridge --hostname bbox1.fgq.com --dns 192.168.43.1 --add-host www.fgq.com:192.168.43.1 --add-host ftp.fgq.com:192.168.43.2 -v /data/docker/volumes/html/:/data/web/html/ -p 80 docker.io/busybox
  -v /data/docker/volumes/html/:/data/web/html/  绑定卷;将宿主机中当前目录/data/docker/volumes/html/挂载到容器的/data/web/html/
  -p 80  容器的80端口
  注意firewalld规则一定要开启,否则不能自动添加iptables规则(dnat),会报错
交互界面
  httpd -f -h /data/web/html/
centos界面
docker port bbox1  80/tcp -> 0.0.0.0:32789  容器的80端口--映射到宿主机的所有地址的随机端口--32789
curl http://192.168.43.82:32789
node2
访问node1外部的网路地址,不访问内部容器的ip地址
curl http://192.168.43.82:32789  非标准端口
node1
bbox1的交互界面
  ctrl+c
  exit
  docker rm bbox1

node1
docker run --name bbox1 -it --net bridge --hostname bbox1.fgq.com --dns 192.168.43.1 --add-host www.fgq.com:192.168.43.1 --add-host ftp.fgq.com:192.168.43.2 -v /data/docker/volumes/html/:/data/web/html/ -p 80:80 docker.io/busybox
  -p 80:80  将容器的80端口映射到主机的80端口
交互界面
  httpd -f -h /data/web/html/
centos界面
docker port bbox1  80/tcp -> 0.0.0.0:80  映射到主机所有地址的80端口
curl http://192.168.43.82
node2
curl http://192.168.43.82  标准端口80  可以访问
node1
bbox1的交互界面
  ctrl+c
  exit
  docker rm bbox1

node1
docker run --name bbox1 -it --net bridge --hostname bbox1.fgq.com --dns 192.168.43.1 --add-host www.fgq.com:192.168.43.1 --add-host ftp.fgq.com:192.168.43.2 -v /data/docker/volumes/html/:/data/web/html/ -p 192.168.43.82:80:80 docker.io/busybox
  -p 192.168.43.82:80:80  将容器的80端口映射到主机某个IP地址的80端口
  如果是"-p 192.168.43.82::80"  将容器的80端口映射到主机某个IP地址的随机端口
  -p ip:host_port:container_port
交互界面
  httpd -f -h /data/web/html/
centos界面
docker port bbox1  80/tcp -> 192.168.43.82:80  映射到主机某个IP地址的80端口
curl http://192.168.43.82
node2
curl http://192.168.43.82  标准端口80  可以访问
node1
bbox1的交互界面
  ctrl+c
  exit
  docker rm bbox1

开放容器内部的多个端口
docker run --name bbox1 -it --net bridge --hostname bbox1.fgq.com --dns 192.168.43.1 --add-host www.fgq.com:192.168.43.1 --add-host ftp.fgq.com:192.168.43.2 -v /data/docker/volumes/html/:/data/web/html/ -p 80 -p 8080 -p 10080 docker.io/busybox
centos界面
docker port bbox1
  10080/tcp -> 0.0.0.0:32790
  80/tcp -> 0.0.0.0:32792  只有此才可以被访问
  8080/tcp -> 0.0.0.0:32791
node1
bbox1的交互界面
  ctrl+c
  exit
  docker rm bbox1

-P  把容器的默认端口都暴露出去--映射为随机的端口
制作镜像时,可以指定默认要暴露的端口,run运行时,直接-P,不用指定端口即可进行暴露默认端口
docker pull redis
docker images
docker run --name redis_fgq -it -P redis
docker port redis_fgq  6379/tcp -> 0.0.0.0:32793
docker inspect redis
  "ExposedPorts": {
                  "6379/tcp": {}  默认暴露的端口
node2
  yum -y install redis
  redis-cli -h 192.168.43.82:32793  显示不能连接--待查原因
  set mykey hello
  get mykey


docker network create  自己定义一个网桥,然后run时,使用"--net +自定义网桥名字"
docker network create --help
man docker network-create
docker network create -d bridge --subnet 10.1.0.0/16 --gateway 10.1.0.1 --ip-range 10.1.0.0/24 br0
  -d bridge  默认就是bridge,可以不写
  br0  自定义名字
docker network ls  显示br0
ifconfig  只显示br-22eeaa43d53c随机名字--inet 10.1.0.1,没有br0
docker network inspect br0  显示一些自己定义的内容
k8s会详细讲


报错:
/usr/bin/docker-current: Error response from daemon: driver failed programming external connectivity on endpoint bbox1 (e5b6bcfe901ff4e4d906db1931e2a1cc8f0c53858736b3c36012c3577ae98127):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 32827 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain/target/match by that name.
解决方案:
systemctl restart firewalld
systemctl restart docker
在执行run命令即可
Dockerfile
指令--大写,虽然不区分大小写;
第一行--FROM--基于哪个镜像;
dockerfile中的环境变量--ENV开头
引用变量--$variable_name/${variable_name}(避免混淆:后面有字符时,使用{})
${variable_name}可以变量替换
${variable:-word}  
  变量未声明/为空,则使用word作为变量的值;否则就使用变量自身的值;
${variable:+word}  不使用默认变量的值,而使用变量后面的word的值
.dockerignore  此文件中的文件不包含至新的镜像中,可以使用Unix统配--*/?等
每个指令,导致新的镜像层出现,尽量精简指令

------------------------------------------------------------
FROM  基于哪个镜像创建
MAINTAINER  创建者的信息
COPY  
ADD
VOLUME
WORKDIR
ENV
RUN
CMD
ENTRYPOINT
ONBUILD
USER


mkdir myimage
vim myimage/Dockerfile
#Test docerfile
FROM docker.io/busybox:latest
MAINTAINER "fgq <fgq_qianggedu@163.com>"
docker build --help
  -f  Default is 'PATH/Dockerfile'
  -t  name:tag  打标签
  -v  基于哪个卷
  使用的内存、CPU...
cd myimage/
docker build -t registry.cn-hangzhou.aliyuncs.com/fgq/busybox:v0.1 ./
docker images
docker login registry.cn-hangzhou.aliyuncs.com  输入密码登录
docker push registry.cn-hangzhou.aliyuncs.com/fgq/busybox:v0.1


vim myimage/index.html
<h1>Default file</h1>
vim myimage/Dockerfile
#Test docerfile
FROM docker.io/busybox:latest
MAINTAINER "fgq <fgq_qianggedu@163.com>"
COPY index.html /data/web/html/  把宿主机当前目录中的index.html复制到容器的/data/web/html目录下
cd myimage/
docker build -t registry.cn-hangzhou.aliyuncs.com/fgq/busybox:v0.2 ./
docker images
docker run --name bbox3 --rm registry.cn-hangzhou.aliyuncs.com/fgq/busybox:v0.2 ls /data/web/html/
  是否有此目录,且有index.html文件
  有多个文件,建议只使用一次COPY来搞定,精简指令

------------------------------------------------------------
ADD  
可以是URL、tar文件展开后的文件-->复制到容器的指定目录中

vim myimage/Dockerfile
#Test docerfile
FROM docker.io/busybox:latest
MAINTAINER "fgq <fgq_qianggedu@163.com>"
#COPY index.html /data/web/html/
ADD https://mirrors.aliyun.com/centos/7.5.1804/extras/x86_64/repodata/repomd.xml https://mirrors.aliyun.com/centos/7.5.1804/extras/x86_64/repodata/repomd.xml.asc /data/
cd myimage/
docker build -t registry.cn-hangzhou.aliyuncs.com/fgq/busybox:v0.3 ./
docker images
docker run --name bbox3 --rm registry.cn-hangzhou.aliyuncs.com/fgq/busybox:v0.3 ls /data/
  显示add的两个文件

------------------------------------------------------------
WORKDIR
为镜像的操作过程指定工作目录的

VOLUME
强依赖于宿主机上有此目录--不同的机器,可能没有此目录
最好docker主机自动创建这个卷

vim myimage/Dockerfile
#Test docerfile
FROM docker.io/busybox:latest
MAINTAINER "fgq <fgq_qianggedu@163.com>"
#COPY index.html /data/web/html/
ADD https://mirrors.aliyun.com/centos/7.5.1804/extras/x86_64/repodata/repomd.xml https://mirrors.aliyun.com/centos/7.5.1804/extras/x86_64/repodata/repomd.xml.asc /data/web/html/  
  (html后的"/"不能少)
VOLUME /data/web/html
  add的两个文件,不会因挂载而被隐藏/覆盖;
  挂载前,先复制容器/data/web/html目录下的文件到卷里面,然后再挂载卷
cd myimage/
docker build -t registry.cn-hangzhou.aliyuncs.com/fgq/busybox:v0.4 ./
docker images
docker run --name bbox3 -it registry.cn-hangzhou.aliyuncs.com/fgq/busybox:v0.4
  bbox3交互界面
  ls /data/web/html  有此目录且有add的两个文件
  exit
docker inspect -f {{.Mounts}} bbox3  显示出挂载关系
  此处没有-v 指明卷,但是每次启动此镜像,就会自动挂载这个卷
docker rm bbox3

------------------------------------------------------------
EXPOSE  暴露端口

vim myimage/Dockerfile
#Test docerfile
FROM docker.io/busybox:latest
MAINTAINER "fgq <fgq_qianggedu@163.com>"
EXPOSE 80 8080

cd myimage/
docker build -t registry.cn-hangzhou.aliyuncs.com/fgq/busybox:v0.5 ./
docker run --name bbox3 -it -P registry.cn-hangzhou.aliyuncs.com/fgq/busybox:v0.5
  必须加-P选项
docker port bbox3  显示随机端口
  80/tcp -> 0.0.0.0:32769
  8080/tcp -> 0.0.0.0:32768
docker rm bbox3
docker run --name bbox3 -it -P -p 80:80 registry.cn-hangzhou.aliyuncs.com/fgq/busybox:v0.5
docker port bbox3
  80/tcp -> 0.0.0.0:80
  8080/tcp -> 0.0.0.0:32770
docker rm bbox3
------------------------------------------------------------
ENV  定义环境变量并引用

vim myimage/Dockerfile
#Test docerfile
FROM docker.io/busybox:latest
MAINTAINER "fgq <fgq_qianggedu@163.com>"
ENV volume_path /www/htdocs  变量名+变量值
VOLUME ${volume_path}  引用变量
cd myimage/
docker build -t registry.cn-hangzhou.aliyuncs.com/fgq/busybox:v0.6 ./
docker run --name bbox3 --rm registry.cn-hangzhou.aliyuncs.com/fgq/busybox:v0.6 ls /www

------------------------------------------------------------
RUN  定义构建镜像过程中的命令

docker pull centos:7.4.1708(系统用的是centos7.5/7.4都可以)
vim /etc/yum.repos.d/CentOS-Base.repo
  只启用[base]仓库,且[base]仓库的gpgcheck=0
  其他库都禁用enabled=0
vim /etc/yum.repos.d/epel.repo
  只启用[epel]仓库,且[epel]仓库的gpgcheck=0
  其他库都禁用enabled=0
mkdir imagews;  cd imagews
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/epel.repo ./
vim Dockerfile
# Nginx Container Based-on Centos
FROM docker.io/centos:7.4.1708  使用centos7.4的镜像也是ok的
MAINTAINER "fgq <fgq_qianggeedu@163.com>"

# ADD yum repository files
ADD CentOS-Base.repo epel.repo  /etc/yum.repos.d/

ENV PATH=/bin:/sbin:/usr/bin:/usr/sbin

# Install nginx
RUN yum -y install nginx && mkdir -p /data/nginx/html

docker images  显示镜像创建成功
docker run --name ngx1 -it registry.cn-hangzhou.aliyuncs.com/fgq/nginx:v0.1
交互界面
  rpm -q nginx  显示已经安装
  yum -y install tree
  tree /data
  exit
不要删除

可以参考别人的dockerfile文件来写
redis事例
https://github.com/docker-library/redis/blob/99a06c057297421f9ea46934c342a2fc00644c4f/3.2/Dockerfile
------------------------------------------------------------
CMD  把镜像启动为容器时的命令

docker start -i -a ngx1  
交互界面
  nginx -h
  nginx  启动nginx
  yum -y install iproute
  ss -ntl
  nginx -s stop  先停掉后台运行的nginx,再让nginx运行在前台
  ss -ntl
  nginx -g "daemon off;"  默认daemon是on--运行在后台;off--运行在前台;
  此时nginx的进程已经在前台运行了

vim imagews/Dockerfile
# Nginx Container Based-on Centos
FROM docker.io/centos:7.4.1708
MAINTAINER "fgq <fgq_qianggeedu@163.com>"

# ADD yum repository files
ADD CentOS-Base.repo epel.repo  /etc/yum.repos.d/

ENV PATH=/bin:/sbin:/usr/bin:/usr/sbin

# Install nginx
RUN yum -y install nginx                             

# EXPOSE port
EXPOSE 80/tcp

# CMD 
CMD nginx -g "daemon off;"
#CMD ["nginx","-g 'daemon off;'"]
#CMD ["nginx","-g","daemon off;"]

cd imagews/
docker build -t registry.cn-hangzhou.aliyuncs.com/fgq/nginx:v0.2 ./
docker images
docker inspect registry.cn-hangzhou.aliyuncs.com/fgq/nginx:v0.2
  "Cmd"  显示"-g 命令"
docker run --name ngx2 -d -P registry.cn-hangzhou.aliyuncs.com/fgq/nginx:v0.2
docker port ngx2
  显示:80/tcp -> 0.0.0.0:32768
浏览器:192.168.0.112:32768/  nginx测试页面

------------------------------------------------------------

Dockerfile的不同版本的控制--定义完成后,推到git上面--想回退,直接从git获取即可
docker/git  联动
本地创建一个Dockerfile,定义、测试、完成后,推到git上面,dockerhub监控git的Dockerfile的文件是否变更;
变更,则pull此Dockerfile文件到本机,并启动,没问题就关闭旧容器、使用这个新容器;
这就是Docker Hub automated builds

mkdir tomcat
cp imagews/CentOS-Base.repo imagews/epel.repo tomcat/
cd /tomcat
vim Dockerfile
# Tomcat Container Based-on Centos
FROM docker.io/centos:7.4.1708
MAINTAINER "fgq <fgq_qianggeedu@163.com>"

# ADD yum repository files
ADD CentOS-Base.repo epel.repo  /etc/yum.repos.d/

ENV PATH=/bin:/sbin:/usr/bin:/usr/sbin

# Install tomcat
RUN yum -y install java-1.8.0-openjdk-devel tomcat tomcat-docs-webapp tomcat-admin-webapps tomcat-webapps && \
        yum clean all

EXPOSE 8080/tcp

CMD source /etc/sysconfig/tomcat && /usr/libexec/tomcat/server start  启动Tomcat
 
docker build -t registry.cn-hangzhou.aliyuncs.com/fgq/tomcat:v0.1 ./
docker run --name tc1 -d -P -p 8080:8080 registry.cn-hangzhou.aliyuncs.com/fgq/tomcat:v0.1
docker images
docker ps -a
docker inspect tc1
docker port tc1  显示:8080/tcp -> 0.0.0.0:8080
浏览器:192.168.0.121:8080  tomcat测试页面  
  ip自动分配,有波动情况

docker stop tc1
docker rm tc1
docker ps -a

------------------------------------------------------------
nginx反代用户请求至Tomcat
法1:容器1--nginx;容器2--tomcat;容器1和2结合
法2:nginx和tomcat通过127.0.0.1互通信息

cd imagews/
vim tc.conf
server {
        listen 80;
        server_name ngx1.fgq.com;  tomcat主机名
        location / {
                proxy_pass http://tc1.fgq.com:8080/;  使用主机名,解析即可--不能用ip(无法确定tomcat启动后,地址是什么)
        }
}

vim imagews/Dockerfile
# Nginx Container Based-on Centos
FROM docker.io/centos:7.4.1708
MAINTAINER "fgq <fgq_qianggeedu@163.com>"

# ADD yum repository files
ADD CentOS-Base.repo epel.repo  /etc/yum.repos.d/

ENV PATH=/bin:/sbin:/usr/bin:/usr/sbin

# Install nginx
RUN yum -y install nginx

ADD tc.conf /etc/nginx/conf.d/  把tomcat配置文件tc.conf复制到容器的/etc/nginx/conf.d/下

EXPOSE 80/tcp

CMD nginx -g "daemon off;"

docker build -t registry.cn-hangzhou.aliyuncs.com/fgq/nginx:v0.3 ./
docker run --name tc1 -d -P -p 8080:8080 registry.cn-hangzhou.aliyuncs.com/fgq/tomcat:v0.1
docker inspect tc1  显示:"IPAddress": "172.17.0.3"
docker run --name nt1 -P -p 80:80 -d --add-host tc1.fgq.com:172.17.0.3 registry.cn-hangzhou.aliyuncs.com/fgq/nginx:v0.3
docker ps -a  显示tomcat和nginx处于运行状态
docker port tc1
  8080/tcp -> 0.0.0.0:8080
docker port nt1
  80/tcp -> 0.0.0.0:80
浏览器:
  192.168.0.127  nginx测试页面
  192.168.0.127:8080  tomcat测试页面
docker stop nt1 tc1
docker rm nt1 tc1

------------------------------------------------------------
ENTRYPOINT
  类似CMD命令,但是不被docker run命令覆盖

cd tomcat/
vim Dockerfile
# Tomcat Container Based-on Centos
FROM docker.io/centos:7.4.1708
MAINTAINER "fgq <fgq_qianggeedu@163.com>"

# ADD yum repository files
ADD CentOS-Base.repo epel.repo  /etc/yum.repos.d/

ENV PATH=/bin:/sbin:/usr/bin:/usr/sbin

# Install tomcat
RUN yum -y install java-1.8.0-openjdk-devel tomcat tomcat-docs-webapp tomcat-admin-webapps tomcat-webapps && \
        yum clean all

EXPOSE 8080/tcp

ENTRYPOINT source /etc/sysconfig/tomcat && /usr/libexec/tomcat/server start

docker build -t registry.cn-hangzhou.aliyuncs.com/fgq/tomcat:v0.2 ./
docker run --name tc1 -P -p 80:80 -it registry.cn-hangzhou.aliyuncs.com/fgq/tomcat:v0.2 /bin/bash
  并没有运行/bin/bash命令,而是运行tomcat,不会被docker run命令--/bin/bash所覆盖
docker exec tc1 ps aux  显示运行的是tomcat
docker stop tc1
docker rm tc1
docker run --name tc1 -P -p 80:80 -it --entrypoint /bin/bash registry.cn-hangzhou.aliyuncs.com/fgq/tomcat:v0.2
  --entrypoint /bin/bash  加了此选项,"docker run"命令可以覆盖ENTRYPOINT
  exit  退出交互模式
docker rm tc1

------------------------------------------------------------
USER  以谁的身份运行image,默认root
ONBUILD
  别人基于我们制作的镜像为基础镜像,就会触发onbuild指令

vim tomcat/Dockerfile 
# Tomcat Container Based-on Centos
FROM docker.io/centos:7.4.1708
MAINTAINER "fgq <fgq_qianggeedu@163.com>"

# ADD yum repository files
ADD CentOS-Base.repo epel.repo  /etc/yum.repos.d/

ENV PATH=/bin:/sbin:/usr/bin:/usr/sbin

# Install tomcat
RUN yum -y install java-1.8.0-openjdk-devel tomcat tomcat-docs-webapp tomcat-admin-webapps tomcat-webapps && \
        yum clean all

EXPOSE 8080/tcp

# 别人基于我们制作的镜像为基础镜像,就会触发onbuild指令
ONBUILD RUN yum -y install iproute tree  

CMD source /etc/sysconfig/tomcat && /usr/libexec/tomcat/server start 
#ENTRYPOINT source /etc/sysconfig/tomcat && /usr/libexec/tomcat/server start

cd tomcat/
docker build -t registry.cn-hangzhou.aliyuncs.com/fgq/tomcat:v0.3 ./
docker run --name tc1 --rm registry.cn-hangzhou.aliyuncs.com/fgq/tomcat:v0.3 rpm -q tree iproute
  显示没有安装tree iproute

再创建一个新的镜像
mkdir newimg
cd newimg/
vim Dockerfile
# Tomcat Container Based-on Centos
FROM registry.cn-hangzhou.aliyuncs.com/fgq/tomcat:v0.3  基础镜像不同了
MAINTAINER "csn <csn_qianggeedu@163.com>"  名字也变了
CMD source /etc/sysconfig/tomcat && /usr/libexec/tomcat/server start

docker build -t registry.cn-hangzhou.aliyuncs.com/fgq/onbuild:v0.1 ./
  显示已经安装了iproute/tree
  自己没有定义要安装,但是基础镜像里面定义了onbuild指令,被触发后,就会安装iproute/tree

docker私有registry

就是一个应用程序服务器--维护index、backend storage 维护
docker-distribution--几千个镜像
  本地私有仓库
  无图形界面--不易搜索,有index,默认不做认证,基于httpd协议提供服务;
  需要额外配置证书,才会支持https
harbor  重量级--提供公有云存储,有图形界面--automate

拓扑结构:
node1-->push image-->node2;  node1推送镜像给node2
node3--pull image--node2;  node3从node2拉取镜像到本地

node2--192.168.200.12
同步时间
仓库准备好
yum info docker-distribution
yum info docker-registry  被定向至docker-distribution,一样的东西
yum -y install docker-distribution
rpm -ql docker-distribution
vim /etc/docker-distribution/registry/config.yml  
  什么都不改
  默认5000端口
  filesystem:
    rootdirectory: /var/lib/registry
    确保此目录足够大,挂载至专门的一个分区,支持硬件级冗余,建议挂载至某个目录下,即:镜像文件的存储路径
systemctl start docker-distribution
ss -ntl  5000端口

node1--192.168.200.11
docker tag 3afd47092a0e 192.168.200.12:5000/centos:7.4.1708
  docker.io/centos  -->  3afd47092a0e
  docker.io/centos把此镜像重新打标签,便于推送给192.168.200.12主机
docker images
docker push 192.168.200.12:5000/centos:7.4.1708
  显示:http: server gave HTTP response to HTTPS client  没有传送成功
  原因是需要使用https或者使用不安全的仓库
cat /usr/lib/systemd/system/docker.service
vim /etc/sysconfig/docker
  在文件最后追加如下内容:
  # Extra Registries
  ADD_REGISTRY="--add-registry 192.168.200.12:5000"
  # Insecure Registries
  INSECURE_REGISTRY="--insecure-registry 192.168.200.12:5000"
建议修改此/etc/containers/registries.conf,但是貌似没用?
systemctl restart docker
ps aux  查看"/usr/bin/dockerd-current"进程的id
cat /proc/2168/cmdline  显示"--add-registry192.168.200.12:5000--insecure-registry192.168.200.12:5000"
docker push 192.168.200.12:5000/centos:7.4.1708  显示推送成功

node2
file /var/lib/registry/docker/registry/v2/blobs/sha256/18/18b8eb7e7f013bd0e585c8c88c6f24599a5db1cbbe72e54246004dad662582c1/data

node3--192.168.200.13
yum -y install docker
scp 192.168.200.11:/etc/sysconfig/docker /etc/sysconfig/docker
systemctl start docker
docker pull 192.168.200.12:5000/centos:7.4.1708  显示pull成功

------------------------------------------------------------
私有仓库+认证

node2--docker-distribution
yum -y install nginx
vim /etc/nginx/conf.d/registry.conf
server {
        listen 80;
        server_name registry.fgq.com;

        client_max_body_size 0;

        location / {
            proxy_pass  http://127.0.0.1:5000;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            proxy_redirect off;
            proxy_buffering off;
            proxy_set_header        Host            $host;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

            auth_basic "Docker Registry Service";
            auth_basic_user_file "/etc/nginx/.ngxpasswd";
        }
}

yum -y install httpd-tools
htpasswd -c -m /etc/nginx/.ngxpasswd tom  设置密码
htpasswd -m /etc/nginx/.ngxpasswd jerry  设置密码
systemctl start nginx;  ss -ntl  80端口

node1
vim /etc/hosts
  192.168.200.11 node1.fgq.com
  192.168.200.12 node2.fgq.com registry.fgq.com
  192.168.200.13 node3.fgq.com
vim /etc/sysconfig/docker
# Extra Registries
ADD_REGISTRY="--add-registry registry.fgq.com"
# Insecure Registries
INSECURE_REGISTRY="--insecure-registry registry.fgq.com"
systemctl restart docker
docker login registry.fgq.com  输入用户名tom和密码
docker images
docker tag 49f7960eb7e4 registry.fgq.com/centos:7.5.1804
  镜像:docker.io/centos:7.5.1804 --> 镜像id:49f7960eb7e4
docker push registry.fgq.com/centos:7.5.1804

node3
scp 192.168.200.11:/etc/sysconfig/docker /etc/sysconfig/docker
scp 192.168.200.11:/etc/hosts /etc/hosts
systemctl restart docker.service
docker login registry.fgq.com  输入用户名jerry和密码
docker pull registry.fgq.com/centos:7.5.1804
docker images  显示已经pull到本地了

------------------------------------------------------------
把80-->443端口的证书认证服务
仅需要add自己的仓库即可,不用insecure指令了

下面的指令--不操作
node3
vim /etc/sysconfig/docker
  删除下面的信息即可:
  # Insecure Registries
  INSECURE_REGISTRY="--insecure-registry registry.fgq.com"
ls /etc/docker/certs.d/  把给docker-registry(node2)发证ca的私有证书放在此目录下

Docker private Registry的Nginx反代配置方式:
        client_max_body_size 0;

        location / {
            proxy_pass  http://registrysrvs;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            proxy_redirect off;
            proxy_buffering off;
            proxy_set_header        Host            $host;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

            auth_basic "Docker Registry Service";
            auth_basic_user_file "/etc/nginx/.ngxpasswd";
        }

node2
ss -ntl  监听在任意地址的5000端口,不安全
vim /etc/docker-distribution/registry/config.yml
http:
    addr: 127.0.0.1:5000  修改处

------------------------------------------------------------
https://hub.docker.com/explore/
dockerhub上pull一个镜像,直接run即可
  registry镜像  nginx镜像
需要二次编辑--设定本地环境的基本设置

资源配置
https://docs.docker.com/config/containers/resource_constraints/

memory
-m or --memory=  最多使用多少资源
--oom-kill-disable  杀死容器内的进程时,有些进程很重要,不希望被kill掉,可以带此选项
--memory-swap*  内存耗尽时,是否允许存储在swap上面

CPU
--cpu-shares  
  CPU分配--一般是平均分配;权重分配,默认都是1024;
  A--2048  占用2/3的CPU资源
  B--1024  占用1/3的CPU资源
--cpu-quota=<value>
--cpu-period=<value>
--cpuset-cpus  指定运行在哪些个CPU上,如:0、1、2、3

devices
--device  可以把某个物理设备固定分配给某个容器使用
如:
--device /dev/cdrom 

network
docker-daemon
Linux
dockerd
file $(which dockerd)
file $(which dockerd-current)
man dockerd
  -D|--debug  调试功能
  不想使用默认值,可以作为/etc/docker/daemon.json文件的元素
https://docs.docker.com/v17.09/engine/admin/#configure-the-docker-daemon
https://docs.docker.com/v17.09/engine/userguide/networking/default_network/custom-docker0/
https://docs.docker.com/v17.09/engine/reference/commandline/dockerd/#miscellaneous-options
vim /etc/docker/daemon.json  参考上面的3个图
键--值  
启用--true、禁用--fauls
{
  "registry-mirrors": ["https://lotwosa6.mirror.aliyuncs.com"],
  "debug": true,
  "fixed-cidr": "10.10.0.0/16",
  "bip": "10.10.0.1/16",
  "add-registry": ["registry.fgq.com"],  注意add-registry
  "insecure-registries": ["registry.fgq.com"]  注意insecure-registries(不同场景是registry)
}
  fixed-cidr/bip--修改docker0的IP地址和地址池
vim /etc/sysconfig/docker
注释掉添加的内容
# Extra Registries
#ADD_REGISTRY="--add-registry registry.fgq.com"
# Insecure Registries
#INSECURE_REGISTRY="--insecure-registry registry.fgq.com"
systemctl restart docker.service
ip a  显示:inet 10.10.0.1/16
docker pull busybox
docker run --name t1 -it docker.io/busybox:latest
交互界面:
  ifconfig -a  显示:eth0  inet addr:10.10.0.2

image.png
https://docs.docker.com/v17.09/engine/reference/commandline/dockerd/#daemon-socket-option
/var/run/docker.sock文件支持本机到本机的通信

node1--192.168.200.11
vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://lotwosa6.mirror.aliyuncs.com"],
  "debug": true,
  "fixed-cidr": "10.10.0.0/16",
  "bip": "10.10.0.1/16",
  "add-registry": ["registry.fgq.com"],
  "insecure-registries": ["registry.fgq.com"],
  "hosts": ["tcp://0.0.0.0:2375"]
}
systemctl restart docker
ss -ntl  2375端口
docker -H "tcp://192.168.0.161:2375" ps -a  本机需要先连接上,再执行"ps -a"命令

vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://lotwosa6.mirror.aliyuncs.com"],
  "debug": true,
  "fixed-cidr": "10.10.0.0/16",
  "bip": "10.10.0.1/16",
  "add-registry": ["registry.fgq.com"],
  "insecure-registries": ["registry.fgq.com"],
  "hosts": ["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"]
}
  unix:///var/run/docker.sock--确保自己可以连接上,并执行命令
systemctl restart docker
ss -ntl  2375端口
docker ps -a  不用手动连接,可以直接执行命令

node3--192.168.200.13
docker -H "tcp://192.168.200.11:2375" ps -a
node3可以直接连接上node1,并执行"ps -a"命令


docker跨主机通信
docker_host1--启动httpd
docker_host2--启动tomcat
httpd反代用户请求至tomcat
暴露端口+访问主机地址--不方便
使用容器地址--跨主机间通信-->k8s

上一篇 下一篇

猜你喜欢

热点阅读