Docker(2)--dockerfile

一.DockerFile

  • dockerfile自动构建docker镜像
类似ansible剧本,大小几kb
手动做镜像:大小几百M+

dockerfile 支持自定义容器的初始命令

dockerfile主要组成部分:
	基础镜像信息       FROM  centos:6.9
	制作镜像操作指令   RUN yum install openssh-server -y
	容器启动时执行指令 CMD ["/bin/bash"]
	
dockerfile常用指令:
	FROM 这个镜像的妈妈是谁?(指定基础镜像)
	MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有)
	LABLE      描述,标签
	
	RUN 你想让它干啥(在命令前面加上RUN即可)
	ADD 给它点创业资金(会自动解压tar)  制作docker基础的系统镜像
	WORKDIR 我是cd,今天刚化了妆(设置当前工作目录)
	VOLUME 给它一个存放行李的地方(设置卷,挂载主机目录)   ---几乎已经不用了
	EXPOSE 它要打开的门是啥(指定对外的端口)(-P 随机端口)
	CMD 奔跑吧,兄弟!(指定容器启动后的要干的事情)(容易被替换)
	
dockerfile其他指令:	
	COPY 复制文件(不会解压)rootfs.tar.gz
	ENV  环境变量
	ENTRYPOINT  容器启动后执行的命令(无法被替换,启容器的时候指定的命令,会被当成参数)

参考其他的dockerfile
官方dockerfile或者时速云镜像广场

a.编写dockerfile:
FROM  centos:6.9
RUN yum install openssh-server -y
RUN service sshd start
RUN echo '123456'|passwd --stdin  root  或者 RUN echo 'root:123456'|chpasswd
CMD ["/usr/sbin/sshd","-D"]

b.使用dockerfile构建镜像
[root@docker01 centos6.9_ssh]# docker image build -t centos_ssh:v4 .

c.测试镜像
[root@docker01 centos6.9_ssh]# docker run -d -p 1022:22 centos_ssh:v4


注意:通过docker exec 可以测试自动构建的镜像里面的环境变量有没有生效

  • docker镜像的分层(kvm 链接克隆,写时复制的特性)
镜像分层的好处:复用,节省磁盘空间,相同的内容只需加载一份到内存。
修改dockerfile之后,再次构建速度快 
  • docker镜像的分层(kvm 链接克隆,写时复制的特性)
镜像分层的好处:复用,节省磁盘空间,相同的内容只需加载一份到内存。
修改dockerfile之后,再次构建速度快
写dockerfile注意:把变化的内容尽可能的放在dockerfile后面,尽可能的合并,
docker 的文件系统:Storage Driver: overlay2

容器都是可写层,镜像都是只读层;容器和镜像的关系就好比类和对象 镜像是类  容器是对象
  • 容器间的互联(–link 是单方向的!!!)
在这里插入代码片
  • docker registry(私有仓库)
docker01:10.0.0.11    docker02:10.0.0.12
1.运行容器
[root@docker01 ~]# docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry  registry

2.上传镜像到私有仓库:
a:给镜像打标签
[root@docker01 ~]# docker  tag centos6-sshd:v3 10.0.0.11:5000/centos6-sshd:v3
b:上传镜像
[root@docker01 ~]# docker push 10.0.0.11:5000/centos6-sshd:v3

如果遇到报错:
The push refers to repository [10.0.0.11:5000/centos6.9_ssh]
Get https://10.0.0.11:5000/v2/: http: server gave HTTP response to HTTPS client

解决方法:
vim  /etc/docker/daemon.json
{  
 "registry-mirrors": ["https://registry.docker-cn.com"],
  "insecure-registries": ["10.0.0.11:5000"]   ----加上
}
systemctl restart docker

3.在docker02上pull docker01的镜像
  [root@docker02 ~]# docker pull 10.0.0.11:5000/docker01/centos6.9_ssh:v3
  
4.查看镜像
 [root@docker02 ~]# docker images
 REPOSITORY                              TAG                 IMAGE ID            CREATED             SIZE
 10.0.0.11:5000/docker01/centos6.9_ssh   v3                  b7dd7eac26d4        25 hours ago        304MB

将docker02上面的镜像不需认证就可以push到docker01 ,这样是很不安全的,所以我们可以增加私有仓库认证
##带basic认证的registry
[root@docker01 ~]# yum install httpd-tools -y
[root@docker01 ~]# mkdir /opt/registry-var/auth/ -p
[root@docker01 ~]# htpasswd  -Bbn oldboy 123456  >> /opt/registry-var/auth/htpasswd
[root@docker01 ~]# docker run -d -p 5000:5000 -v /opt/registry-var/auth/:/auth/ -v /opt/myregistry:/var/lib/registry -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e  "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry 

将docker02的busybox镜像push到docker01
[root@docker02 ~]# docker pull busybox
[root@docker02 ~]# docker tag busybox:latest 10.0.0.11:5000/oldboy/busybox:latest
[root@docker02 ~]# docker push 10.0.0.11:5000/oldboy/busybox:latest
The push refers to repository [10.0.0.11:5000/oldboy/busybox]
d1156b98822d: Preparing 
no basic auth credentials
此时,提示我们需要认证登录
[root@docker02 ~]# docker login 10.0.0.11:5000
Username: xxx
Password: xxx
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@docker02 ~]# docker push 10.0.0.11:5000/oldboy/busybox:latest
The push refers to repository [10.0.0.11:5000/oldboy/busybox]
d1156b98822d: Pushed 
latest: digest: sha256:4fe8827f51a5e11bb83afa8227cbccb402df840d32c6b633b7ad079bc8144100 size: 527

如果我们需要向Docker Hub 推送我们的镜像,需要先去官网注册一个账号
 
查看epol源:
   [root@docker01 ~]# ls /etc/yum.repos.d
  • docker-compose(单机版的容器编排工具):一次可以起多个容器
提前需要安装:
[root@docker01 ~]#  yum -y install epel-release
[root@docker01 ~]# yum install -y python2-pip
[root@docker01 ~]# pip install docker-compose  -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
[root@docker01 ~]# cd /opt
[root@docker01 opt]# mkdir my_wordpress
[root@docker01 opt]# vi docker-compose.yaml
version: '3'

services:
   db:
     image: mysql:5.7
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress

#启动
[root@docker01 my_wordpress]# docker-compose up 
#后台启动
[root@docker01 my_wordpress]# docker-compose up -d

  • 重启docker服务,容器全部退出的解决办法
方法一:docker run  --restart=always

方法二:"live-restore": true
docker server配置文件/etc/docker/daemon.json参考
{
 "registry-mirrors": ["http://b7a9017d.m.daocloud.io"],
 "graph":"/opt/mydocker",
 "insecure-registries":["10.0.0.11:5000"],
 "live-restore": true
}
  • Docker网络类型
None:不为容器配置任何网络功能,--net=none
Container:与另一个运行中的容器共享Network Namespace,--net=container:containerID(K8S)
Host:与宿主机共享Network Namespace,--net=host
Bridge:Docker设计的NAT网络模型
  • Docker跨主机容器之间的通信macvlan
默认一个物理网卡,只有一个物理地址,虚拟多个mac地址
首先得再创建一块网卡,两台主机之间的vlan要一致

##创建macvlan网络
docker01和docker02都需要进行如下设置:
[root@docker01 my_wordpress]# docker network create --driver macvlan --subnet 172.16.1.0/24 --gateway 172.16.1.254 -o parent=eth0 macvlan_1
[root@docker01 my_wordpress]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
325463477fd5        bridge              bridge              local
80d222b72819        host                host                local
ffd1270cfa88        macvlan_1           macvlan             local
0f71637ad566        none                null                local
49f5c79512d2        opt_default         bridge              local

##设置eth1的网卡为混杂模式
[root@docker01 my_wordpress]# ip link set eth1 promisc on
##创建使用macvlan网络的容器
[root@docker01 my_wordpress]# docker run -it --network macvlan_1 --ip=172.16.1.3 centos6.9_ssh:v3 /bin/bash         --->docker01
[root@docker02 my_wordpress]# docker run -it --network macvlan_1 --ip=172.16.1.4 centos6.9_ssh:v3 /bin/bash        --->docker02
  • Dcoker跨主机容器通信之overlay
1)准备工作
docker01上:
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
设置容器的主机名

consul:kv类型的存储数据库(key:value)


docker01、02上:
vim  /etc/docker/daemon.json
{
  "hosts":["tcvim p://0.0.0.0:2376","unix:///var/run/docker.sock"],
  "cluster-store": "consul://10.0.0.11:8500",
  "cluster-advertise": "10.0.0.11:2376"
}

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

  • docker企业级镜像仓库harbor(vmware 中国团队)
第一步:安装docker和docker-compose

第二步:下载harbor-offline-installer-v1.3.0.tgz

第三步:上传到/opt,并解压

第四步:修改harbor.cfg配置文件
hostname = 10.0.0.11
harbor_admin_password = 123456

第五步:执行install.sh

harbor故障解决方法:
docker-compose stop
docker rm -f `docker ps -a -q`
docker-compose up  -d

docker 仓库登录之后,缓存文件存放目录:
 [root@docker01 harbor]# cat /root/.docker/config.json

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值