Docker
2018-06-08 本文已影响2人
Miracle001
docker分层
Docker Host and Registry
创建
管理
操作指南
镜像的生成途径
docker-daemon
Linux
安装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