docker-02

10:自动制作docker镜像

镜像: 中药

dockerfile: 配方

dockerfile常用指令

FROM  基础镜像
RUN   制作镜像过程中需要的执行命令
CMD   容器启动的时候执行的初始命令,容易被替换
ENTRYPOINT  容器启动的时候执行的初始命令,不能被替换,如果同时使用CMD和ENTRYPOINT,cmd命令将作为ENTRYPOINT命令的参数
ADD   把dockerfile当前目录下的文件拷贝到容器中(自动解压tar包)
COPY  把dockerfile当前目录下的文件拷贝到容器中(不解压tar包)
WORKDIR 指定容器的默认工作目录
EXPOSE  镜像要暴露的端口

根据dockerfile自动构建镜像的思路

dockerfile书写注意事项

1、使用dockerfile构建新的镜像文件名必须叫dockerfile

2、一个目录下只能有一个文件交dockerfile

a:手动制作docker镜像,记录历史命令
    文件拷贝: docker cp d4ddfef481a8:/etc/hosts .   //死掉的容器一样可以拷贝文件
b:根据历史命令编写dockerfile文件
c:docker build构建docker镜像
d:测试镜像的功能

dockerfile单服务例子1:

注意CMD的写法,每一个空格使用 “逗号”隔开,每个关键字使用 或双引号隔开

FROM centos:6.9
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN yum install nginx -y
CMD ["nginx","-g","daemon off;"]
构建:
[root@docker01 centos6.9_nginx]# docker image build -t centos6.9_nginx:v2 .
参数:
-t 给构建后的镜象起一个名字

dockerfile多服务例子2:

FROM centos:6.9
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
ADD nginx.repo /etc/yum.repos.d/nginx.repo
RUN yum install nginx php-fpm php-gd php-mbstring unzip -y
ADD www.conf /etc/php-fpm.d/www.conf
ADD default.conf /etc/nginx/conf.d/default.conf
RUN mkdir /html
ADD kodexplorer4.40.zip /html/kodexplorer4.40.zip
WORKDIR /html
RUN unzip kodexplorer4.40.zip 
RUN useradd nginx 
RUN chown -R nginx:nginx .
ADD init.sh /init.sh
CMD ["/bin/bash","/init.sh"]

cat /init.sh
#!/bin/bash
service php-fpm start
nginx -g 'daemon off;'

dockerfile使用环境变量的例子:

FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install nginx openssh-server initscripts -y
RUN /usr/sbin/sshd-keygen
ADD init.sh  /init.sh
ENTRYPOINT ["/bin/bash","/init.sh"]

cat  init.sh
#!/bin/bash
if [ -z $SSH_PWD ];then
    SSH_PWD=$1
fi

echo $SSH_PWD|passwd --stdin root
nginx
/usr/sbin/sshd -D
构建容器:
docker image  bulid -t centos7_ssh:v1 .
创建容器:
启动方法一:docker run -it -d -p 2022:22 --env "SSH_PWD=123456" centos7_ssh:v1
启动方法二:docker run -it -d -p 2023:22 centos7_ssh:v1 123456 

dockerfile 构建底层系统景象

[root@docker01 alpine]# ls
dockerfile  rootfs  rootfs.tar.gz
[root@docker01 alpine]# cat dockerfile 
FROM scratch 
ADD  rootfs.tar.gz /
CMD ["/bin/sh"]
[root@docker01 alpine]# docker image build  -t alpine:v1 .

11:docker镜像的分层(复用,节省空间)

这里要注意,只有之前的镜像发生改变了,才会提交为新的镜像(新的层)

12:dockerfile的优化

a: 使用体积小的镜像alpine
b:尽可能的清理无用的缓存文件
c:修改dockerfile的时候,尽可能把修改的内容放在最后
d:使用.dockerignore忽略构建docker镜像时,不需要的文件(.dockerignore是一个文件,把不需要的文件名写到此文件中即可)

13:docker run --link(容器间的互联)

docker run --link 正在运行容器的名字

 docker run --name mysql-server -t \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      -d mysql:5.7 \
      --character-set-server=utf8 --collation-server=utf8_bin
     
docker run --name zabbix-java-gateway -t \
      -d zabbix/zabbix-java-gateway:latest
    
docker run --name zabbix-server-mysql -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      -e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
      --link mysql-server:mysql \
      --link zabbix-java-gateway:zabbix-java-gateway \
      -p 10051:10051 \
      -d zabbix/zabbix-server-mysql:latest
      
docker run --name zabbix-web-nginx-mysql -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      --link mysql-server:mysql \
      --link zabbix-server-mysql:zabbix-server \
      -p 80:80 \
      -d zabbix/zabbix-web-nginx-mysql:latest

14:docker-compose(单机版的容器编排)

yum install docker-compose -y(需要epel源)

version: '3'

services:
   mysql-server:
     image: mysql:5.7
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: root_pwd
       MYSQL_DATABASE: zabbix
       MYSQL_USER: zabbix
       MYSQL_PASSWORD: zabbix_pwd
     command: --character-set-server=utf8
     
   zabbix-java-gateway:
     image: zabbix/zabbix-java-gateway:latest
     restart: always
     
   zabbix-server:
     depends_on:
       - mysql-server
     image: zabbix/zabbix-server-mysql:latest
     restart: always
     environment:
       DB_SERVER_HOST: mysql-server
       MYSQL_DATABASE: zabbix
       MYSQL_USER: zabbix
       MYSQL_PASSWORD: zabbix_pwd
       MYSQL_ROOT_PASSWORD: root_pwd
       ZBX_JAVAGATEWAY: zabbix-java-gateway
     ports:
       - "10051:10051"
       
   zabbix-web-nginx-mysql:
     depends_on:
       - zabbix-server
     image: zabbix/zabbix-web-nginx-mysql:latest
     ports:
       - "80:80"
     restart: always
     environment:
       DB_SERVER_HOST: mysql-server
       MYSQL_DATABASE: zabbix
       MYSQL_USER: zabbix
       MYSQL_PASSWORD: zabbix_pwd
       MYSQL_ROOT_PASSWORD: root_pwd

docker-compose up -d 启动服务

docker-compose down 停止服务

知识点:

a、使用docker-compose创建容器,必须使用docker-cmopose.yml 或docker-compose.yaml为文件名,一个目录下有且只有一个。

b、docker-compose创建的container自动做hosts文件解析。

15:私有仓库docker-registry

#启动私有仓库
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry

#镜像地址
nginx:1.15        官方仓库的官方镜像
nginx/nginx:1.15  官方仓库的用户镜像

daocloud.io/nginx/nginx:1.15  私有仓库的镜像

#上传镜像
docker tag alpine:3.9 10.0.0.11:5000/alpine:3.9
docker image push 10.0.0.11:5000/alpine:3.9
#第一次上传镜像会报错
vim /etc/docker/daemon.json
{
  "insecure-registries": ["10.0.0.11:5000"]
}

systemctl  restart docker

docker image push 10.0.0.11:5000/alpine:3.9


#下载镜像
docker image pull 10.0.0.11:5000/alpine:3.9

16: 企业级私有仓库harbor(docker-compose)

#下载安装器
https://github.com/goharbor/harbor/releases/download/v1.10.0/harbor-offline-installer-v1.10.0.tgz
#解压
[root@docker01 opt]# tar xf harbor-offline-installer-v1.8.0.tgz 
#修改配置文件
cd  harbor
vim harbor.yml
hostname: 10.0.0.11
harbor_admin_password: 123456
#执行安装脚本
 ./install.sh

为harbor配置https证书

#修改harbor.yml
#配置域名
hostname: blog.oldqiang.com

#配置证书
https:
  port: 443
  certificate: /opt/certs/nginx/1_blog.oldqiang.com_bundle.crt
  private_key: /opt/certs/nginx/2_blog.oldqiang.com.key

#重新执行安装脚本
./install.sh

17:docker基础网络

四种基础网络类型

bridge  默认类型 NAT模式
host    host类型,使用宿主机网络,网络性能最高
container 容器类型。使用其他容器共用网络,k8s中使用
none    没有网络,上不了外网

创建自定义网络

docker network create -d bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 oldqiang

18:跨宿主机容器间的通讯之macvlan

#创建网络
docker network create -d macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1

#启动容器
docker run -it --network macvlan_1 --ip 10.0.0.105 alpine:3.9 

19:跨宿主机容器间的通讯之overlay

docker03上: consul存储ip地址的分配
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap


docker01、02上:
vim  /etc/docker/daemon.json
{
  "cluster-store": "consul://10.0.0.13:8500",
  "cluster-advertise": "10.0.0.11:2376"
}

vim /usr/lib/systemd/system/docker.service
systemctl daemon-reload 
systemctl restart docker




2)创建overlay网络
docker network create -d overlay --subnet 172.16.2.0/24 --gateway 172.16.2.254  ol1

3)启动容器测试

docker run -it --network ol1 --name oldboy01  alpine:3.9  /bin/sh
每个容器有两块网卡,eth0实现容器间的通讯,eth1实现容器访问外网

20:docker容器的监控

#客户端节点
#启动node-exporter
docker run -d   -p 9100:9100   -v "/:/host:ro,rslave"   --name=node_exporter   quay.io/prometheus/node-exporter   --path.rootfs /host

#启动cadvisor
docker run --volume=/:/rootfs:ro  --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro  --publish=8080:8080 --detach=true --name=cadvisor google/cadvisor:latest

#prometheus节点
安装prometheus和grafana
 tar xf prometheus-2.12.0.linux-amd64.tar.gz 

 cd prometheus-2.12.0.linux-amd64/
vim prometheus.yml 
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']
  - job_name: 'cadvisor'
    static_configs:
    - targets: ['10.0.0.11:8080','10.0.0.12:8080']
  - job_name: 'node_exporter'
    static_configs:
    - targets: ['10.0.0.11:9100','10.0.0.12:9100']

./prometheus --config.file="prometheus.yml" 
#安装grafana
yum localinstall grafana-6.3.3-1.x86_64.rpm -y
systemctl start grafana-server.service 
systemctl enable grafana-server.service
#访问grafana  http://IP:3000,默认账号admin:admin
新建数据源--导入dashboard模板
?著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容