一.DockerFile
类似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
容器都是可写层,镜像都是只读层;容器和镜像的关系就好比类和对象 镜像是类 容器是对象
在这里插入代码片
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 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
}
None:不为容器配置任何网络功能,--net=none
Container:与另一个运行中的容器共享Network Namespace,--net=container:containerID(K8S)
Host:与宿主机共享Network Namespace,--net=host
Bridge:Docker设计的NAT网络模型
默认一个物理网卡,只有一个物理地址,虚拟多个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
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