0
点赞
收藏
分享

微信扫一扫

docker容器讲解


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 创建仓库管理

docker容器讲解_linux

2.2 创建复制管理

docker容器讲解_mysql_02

2.3 测试

docker容器讲解_centos_03



举报

相关推荐

0 条评论