docker容器
目录
- docker容器
- 1.什么是容器
- 2.容器和虚拟化得区别
- 3.容器技术的发展过程
- 4.安装docker-ce
- 4.1 docker的主要组成部分
- 4.2 启动第一个容器
- 5.docker的镜像管理下载 及加速器
- 6.基本操作命令
- 7.docker容器(端口映射)
- 7.1随机映射
- 8 docker的volum数据卷管理
- 9 将本地文件关联到容器中
- 10 手动制作一个镜像
- 10.1 单服务
- 10.2 多服务
- 10.3 基于centos6.9 dockerfile构建nginx
- 11 dockerfile 剧本
- 11.1 dockerfile 主要组成部分
- 11.2 dockerfile 常用指令
- 11.3 dockerfile其他命令:
- 11.4 容器分层
- 12.容器之间的互联 (--link)
- 13 重启docker服务,容器全部退出的解决办法
- 14.使用docker运行zabbix-server
- 15.docker registry (仓库)
- 16.Docker跨主机容器之间的通信macvlan
- 17:Dcoker跨主机容器通信之overlay
- 18.docker-compose(单机版的容器编排工具)
- 18.1 部署wordpress
- 18.2 部署zabbix
- 19:docker企业级镜像仓库harbor(vmware 中国团队)
- harbor 主从复制
1.什么是容器
容器就是在隔离得环境运行的一个进程,如果进程停止,容器就会销毁。隔离得环境拥有自己的文件系统,ip地址,主机名等。
2.容器和虚拟化得区别
linux容器技术,容器虚拟化和kvm虚拟化的区别
kvm虚拟化:需要硬件的支持,需要模拟硬件,可以运行不同的操作系统,启动时间分钟级别(开机启动流程)
linux启动流程
bios开机自检、根据bios设置的优先启动项、读取mbr引导、加载内核、启动一个进程
容器虚拟化:不需要硬件的在支持。不需要模拟硬件,供应宿主机的内核,启动时间秒级(没有开机启动流程)
总结:
1.与宿主机使用同一个内核,性能损耗小
2.不需要指令集模拟
3.容器可以在cpu核心的本地运行指令,不需要任何专门的解析机制。
4.避免了准虚拟化和系统调用替换中的复杂性
5.轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享
3.容器技术的发展过程
1.chroot技术,新建一个子系统
参考资料https://www.ibm.com/developerworks/cn/linux/1-cn-chroot
作业:使用chroot监狱限制ssh用户访问指定目录和指定的命令
https://linux.cn/article-8313-1.html
2.linux容器(lxc) Linux container (namespaces)命名空间 隔离环境 及cgroups资源限制
cgroups:(资源限制) cpu、内存、硬盘io
有一个相同函数名字:
. sss.sh ===name1.sss()
. xxxx.sh ====name2.sss()
安装lxc
yum -y install lxc* libcgroup* bridge-utils.x86_64
systemctl start cgroup
systemctl start lxc
创建lxc容器
lxc-create -t download -n centos 6
启动docker容器
docker start
构建:做一个docker镜像
运输:docker pull
运行:启动一个容器
每一个容器,他都有自己的文件系统rootfs
kvm解决了硬盘和操作系统的依赖关系
kvm独立的虚拟磁盘,xml配置文件
docker解决了软件和操作系统环境之间的依赖,能够让独立的服务或应用程序在不同的环境中,得到相同的运行结果
4.安装docker-ce
使用清华大学镜像镜像仓库 和阿里BASE源
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#安装
yum install -y docker-ce
4.1 docker的主要组成部分
docker是传统的cs架构分为docker client和docker server,向mysql一样
命令:docker version
[root@LNMP_cacti nfs]# docker version
Client: Docker Engine - Community
Version: 19.03.5
API version: 1.40
Go version: go1.12.12
Git commit: 633a0ea
Built: Wed Nov 13 07:25:41 2019
OS/Arch: linux/amd64
Experimental: false
docker info (如果要做监控)
docker主要组件有:镜像、容器、仓库
启动容器必须需要一个镜像,仓库中存储镜像
容器–镜像–仓库
4.2 启动第一个容器
docker run -d -p 80:80 nginx
run(创建并运行容器)
-d 放在后台
-p 端口映射
-v 源路径(宿主机):目标路径(容器)
5.docker的镜像管理下载 及加速器
搜索镜像
docker search httpd //搜索一个镜像服务
1.优先考虑官方
2.stars数量多
获取镜像
docker pull httpd //下载镜像
镜像加速器由阿里云加速器,daocloud加速器,中科大加速器,docker
中国官方加速器:https://registry.docker-cn.com
dockup pull centos:6.8 (没有指定版本,默认会下载新版本)
docker pull daocloud.io/huangzhichong/alpine-cn:latest
##配置docker镜像加速
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://reistry.docker-cn.com"]
}
docker run === docker create + docker start
6.基本操作命令
搜索镜像 | docker search httpd |
查看镜像 | docker images |
导出镜像 | docker image save -o /root/docker_nginx.tar.gz nginx:1.13 |
导入镜像 | docker image load -i /root/docker_nginx.tar.gz |
删除镜像 | docker image rm httpd:2.2 |
启动镜像 | docker run -it -d -p 888:80 --name nginx --restart=always image_name CMD -p:端口映射 –name:容器命名 –restart=always: 开启自启 |
停止一个容器 再次启动一个容器 杀死容器 | docker stop docker start docker kill container_name |
查看所有容器 | docker ps docker ps -a |
进入容器系统中(会分配一个新的tty)s 进入系统中(使用同一个终端) | docker exec -it 容器的id或容器名字 /bin/bash docker attach -it 容器id或容器名字 |
删除容器 批量删除容器 | docker rm 容器id或名称 docker rm -f $(docker ps -a -q) |
提交容器到镜像 | docker commit 容器ID 新的镜像名称 |
通过dockerfile构建镜像 | docker build -t nginx:v1 . |
总结:docker容器内的第一个进程(初始命令)必须一直处于后台运行的状态(必须夯住),否则这个容器,就处于推出状态。
业务在容器中运行:夯住。启动服务
7.docker容器(端口映射)
指定映射(docker 会自动添加一条iptables规则来实现端口映射)
-p hostport:containerport
-p ip:hostport:containerport
-p ip::containerport(随机端口)
-p hostport:containerport:udp
-p 81:80 -p 443:443 可以指定多个-p
7.1随机映射
docker run -p (随机端口)
通过iptables来时现端口映射
8 docker的volum数据卷管理
//将数据卷和原有的容器中的文件进行同步,容器中删除则卷组中还存在 ,便于下次调用数据卷使用
docker volum create 卷名 //创建卷名
docker volum ls //查看卷名
docker run -d -p 80:80 -v 卷名:/usr/share/nginx/html nginx:latest //关联卷名
docker volume inspect oldboy //查看数据就信息
[
{
"CreatedAt": "2020-01-02T22:31:50+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/oldboy/_data", //存放的文件
"Name": "oldboy",
"Options": {},
"Scope": "local"
}
]
讲代码cp到/var/lib/docker/volumes/oldboy/_data下
9 将本地文件关联到容器中
docker run -d -p 192.168.101.19:8888:80 -v /opt/docker/html:/usr/local/apache2/htdocs/ httpd:2.2
10 手动制作一个镜像
10.1 单服务
1.启动一个基础容器,安装服务sshd
[root@f36834f6567d ~]# yum -y install openssh-server
[root@f36834f6567d ~]# service start sshd
[root@f36834f6567d ~]# echo "123.com.cn" | passwd --stdin root
exit
2.提交制作好的镜像
[root@docker1 ~]# docker commit 容器名或id 自定义的镜像名:加版本
3.测试镜像
[root@docker1 ~]# docker run -d -p 4022:22 centos6.9_ssh:v1 /usr/sbin/sshd -D
[root@docker1 ~]# ssh 127.0.0.1 -p 4022
10.2 多服务
1.启动一个基础容器,安装服务 sshd nginx
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
[root@f36834f6567d ~]# yum -y install openssh-server nginx
[root@f36834f6567d ~]# service start sshd
[root@f36834f6567d ~]# echo "123.com.cn" | passwd --stdin root
exit
[root@f36834f6567d ~]# vi /init.sh
#/bin/bash
#service nginx start
#/usr/sbin/sshd -D
或者
service sshd start
nginx -g 'daemon off;'
2.提交制作好的镜像
[root@docker1 ~]# docker commit f36834f6567d centos6.9_ssh_nginx:v1
3.测试镜像
[root@docker1 ~]# docker run -d -p 5022:22 -p 85:80 centos6.9_ssh:v1 /bin/bash /init.sh
[root@docker1 ~]# ssh 127.0.0.1 -p 5022
[root@docker1 ~]# curl 127.0.0.1:5022
10.3 基于centos6.9 dockerfile构建nginx
使用dockerfile基于centos6.9,安装sshd和ssh双服务的镜像,
vim dockerfile
FROM centos6.9_ssh
RUN echo RUN echo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo \
/etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
yum install nginx -y
ADD init.sh /init.sh
CMD [/bin/bash","/ini.sh"]
vim ini.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
nginx -g ‘daemon off;’
docler image build -t 镜像名称:版本 .
11 dockerfile 剧本
dockerfile自动构建docker镜像类似ansible剧本
11.1 dockerfile 主要组成部分
基础镜像信息 FROM centos:6.9
制作镜像容器操作指令 RUN yum install openssl-server -y
容器启动时执行的命令 CMD ["/bin/bash"]
11.2 dockerfile 常用指令
FROM 这个镜像的妈妈是谁? (指定基础镜像)
MAINTAINER 告诉别人,谁负责养他 (指定维护者信息,可以没有)
LABLE 标签 (描述信息)
RUN 你想让它干什么 (在命令前面加上RUN)
ADD 给它点创业资金 (COPY文件,会自动解压)
WORKDIR 我是cd,今天化妆(设置当前工作目录)
VOLUME 给它一个存放行李的地方(设置卷,挂在主机目录)
EXPOSE 它要打开的们是啥(指定对外的端口(-P随机端口)
CMD 奔跑把 兄弟!(指定容器启动后的要干的事情)(容易被替换)
11.3 dockerfile其他命令:
COPY 复制文件
ENV 环境变量
ENTRYPOINT (容器启动后执行的命令)无法被代替,其容器的时候指定的命令 会被当做参数
举例:
vim dockerfile
DROM centos:6.9
RUN echo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN yum -y install httpd openssh-server
RUN /etc/init.d/sshd
CMD ["/usr/sbin/httpd","-D"]
#构建
docler image build -t 镜像名称:版本 .
#构建
docler image build -t 镜像名称:版本 .
11.4 容器分层
镜像分层好处:节省磁盘空间。相同内容只需要加载一份到内存。
修改dockerfile,再次构建速度快
LXC完整克隆
12.容器之间的互联 (–link)
做容器的hosts解析
docker run -d -p 80:80 --name nginx1 nginx:v1
docker run -it --link nginx1 nginx:v1
后者只能解析前者的ip地址
//-t 表示终端 -i 表示交互式
13 重启docker服务,容器全部退出的解决办法
方法一:docker run --restart=always
方法二:"live-restore": true
docker server配置文件/etc/docker/daemon.json参考
{
"live-restore": true
}
systemctl restart docker
14.使用docker运行zabbix-server
docker pull mysql:5.7
docker pull zabbix/zabbix-web-nginx-mysql:latest
docker pull zabbix/zabbix-java-gateway:latest
docker pull zabbix/zabbix-server-mysql:latest
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
15.docker registry (仓库)
##普通的registry
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
上传镜像到私有仓库:
a:给镜像打标签
docker tag centos6-sshd:v3 10.0.0.11:5000/centos6-sshd:v3
b:上传镜像
docker push 10.0.0.11:5000/centos6-sshd:v3
docker run -d 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
{
"insecure-registries": ["10.0.0.11:5000"]
}
systemctl restart docker
##带basic认证的registry
yum install httpd-tools -y
mkdir /opt/registry-var/auth/ -p
htpasswd -Bbn oldboy 123456 >> /opt/registry-var/auth/htpasswd
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
16.Docker跨主机容器之间的通信macvlan
默认一个物理网卡,只有一个物理地址,虚拟多个mac地址
##创建macvlan网络
docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
##设置eth0的网卡为混杂模式
ip link set eth1 promisc on
##创建使用macvlan网络的容器
docker run -it --network macvlan_1 --ip=10.0.0.200 busybox
17: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":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://10.0.0.13:8500",
"cluster-advertise": "10.0.0.11:2376",
"live-restore": true
}
vim /etc/docker/daemon.json
vim /usr/lib/systemd/system/docker.service
systemctl daemon-reload
systemctl restart docker
无法启动报错
Jul 2 15:20:11 docker2 dockerd: unable to configure the Docker daemon with file /etc/docker/daemon.json: the following directives are specified both as a flag and in the configuration file: hosts: (from flag: [fd://], from file: [tcp://0.0.0.0:2376 unix:///var/run/docker.sock])
解决办法 删除daemon.json "hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
2)创建overlay网络
docker network create -d overlay --subnet 172.16.1.0/24 --gateway 172.16.1.254 ol1
3)启动容器测试
docker run -it --network ol1 --name oldboy01 busybox /bin/sh
每个容器有两块网卡,eth0实现容器间的通讯,eth1实现容器访问外网
18.docker-compose(单机版的容器编排工具)
前面我们使用docker的时候,定义dockerfile,每次只能启动一个容器,然后微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启动,那么效率会非常低
使用docker compose可以轻松、高效的管理容器,可以一起运行多个容器
安装 docker-compose
yum install -y python2-pip(需要epel源)
pip install docker-compose(默认pypi源在国外) #可以忽略此行
pip install pip -U
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple docker-compose
安装报错信息
ERROR: Cannot uninstall 'subprocess32'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
解决
[root@docker03 ~]# pip install subprocess32 --upgrade --ignore-installed
验证
安装成功后 会有docker-compose 命令
参数 | 命令 |
ps:列出所有容器 | docker-compose ps |
logs:查看服务日志输出 | docker-compose logs |
port:打印绑定的公共端口 | docker-compose port wordpress 80 |
build:构建或重新构建服务 | docker-compose build |
start:启动指定服务已存在的容器 | docker-compose start wordpress |
stop:停止已运行的服务的容器 | docker-compose stop wordpress |
rm:删除指定服务的容器 | docker-compose rm wordpress |
up:构建、启动容器 | docker-compose up |
kill:杀掉容器 | docker-compose kill wordpress |
scale:指定服务器运行容器的个数 | docker-compose scale wordpress=3 |
run运行 | docker-compose run web bash |
docker-compose.yaml属性
##详细指令
http://www.jianshu.com/p/2217cfed29d7
18.1 部署wordpress
docker pull mysql:5.7
docker pull wordpress:latest
cd my_wordpress/
vi docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- web_data:/var/www/html
ports:
- "80:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:
web_data:
#启动
docker-compose up
#后台启动
docker-compose up -d
18.2 部署zabbix
环境:docker-mysql-5.7.tar.gz、zabbix-java-gateway.tar.gz、zabbix-server-mysql.tar.gz、zabbix-web-nginx-mysql.tar.gz
for i in `ls` ;do docker load -i $i;done
mkdir my_zabbix && cd /my_zabbix
vim docker-compose.yml
version: '3'
services:
zabbix-db:
image: 192.168.154.20:5000/mysql:5.7
volumes:
- zabbix_db_data:/var/lib/mysql
restart: always
environment:
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_pwd
MYSQL_ROOT_PASSWORD: root_pwd
command: --character-set-server=utf8
zabbix-java-gateway:
image: 192.168.154.20:5000/zabbix-java-gateway:latest
restart: always
zabbix-server:
depends_on:
- zabbix-db
image: 192.168.154.20:5000/zabbix-server-mysql:latest
ports:
- "10051:10051"
restart: always
environment:
DB_SERVER_HOST: zabbix-db
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_pwd
MYSQL_ROOT_PASSWORD: root_pwd
ZBX_JAVAGATEWAY: zabbix-java-gateway
zabbix-web:
depends_on:
- zabbix-db
- zabbix-server
image: 192.168.154.20:5000/zabbix-web-nginx-mysql:latest
volumes:
- zabbix_web_html:/usr/share/zabbix
ports:
- "80"
restart: always
environment:
DB_SERVER_HOST: zabbix-db
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_pwd
MYSQL_ROOT_PASSWORD: root_pwd
volumes:
zabbix_db_data:
zabbix_web_html:
#启动
docker-compose up
#后台启动
docker-compose up -d
#一次再创建多个容器个容器
docker-compose scale wordpress=3
19: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
排错 docker 容器后无法访问页
解决:
在harbor目录下重启harbor服务
docker-compose restart
harbor 主从复制
环境
harbor-master 192.168.10.20
harbor-backup 192.168.10.21
1.所有节点都部署harbor
2.web界面操作
2.1 创建仓库管理
2.2 创建复制管理
2.3 测试