docker

1.什么是容器

容器是隔离的环境中运行的一个进程,如果进程结束,容器就会停止,容器的隔离环境,拥有自己的ip地址,系统文件,主机名,进程管理
程序: 代码,软件,命令
进程:正在运行的程序

2:容器和虚拟机的区别

虚拟机: 硬件cpu支持(vt虚拟化),模拟计算硬件,走正常的开机启动

bios开机自检–根据bios启动项–读取硬盘第一个扇区grub,uefi, centos7, 加载内核,启动系统第一个进程/sbin/init systemd

容器: 不需要硬件cpu的支持,共用宿主机内核,启动容器的第一个进程
容器优势: 启动快,性能高,损耗少,轻量级

3:docker-ce的安装

主机名内存ip
docker012G10.0.0.11
docker022G10.0.0.12
#安装docker-ce
docker engine: 1.3
docketr ce:  17.03 

wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum install docker-ce -y

systemctl enable docker
systemctl start docker

#验证
[root@docker01 yum.repos.d]# 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

4:docker主要内容

docker是一个cs架构, docker主要:镜像 容器 仓库 网络 存储 监控
docker是一个软件的打包技术.

docker  run -d  -p 80:80  nginx:latest 
run 创建并启动一个容器
-d  放后台启动
-p  端口映射
nginx:latest docker镜像名称

5:docker镜像常用命令

docker search  搜索镜像, 优先选官方,stars数量多
docker pull    拉取镜像(下载镜像)
docker push    推送镜像(上传镜像)
docker load    导入镜像
   例子: docker load  -i  docker_nginx.tar.gz
docker save    导出镜像
   例子:docker save centos:7 -o docker_centos7.tar.gz
docker images   查看镜像列表
docker rmi      删除镜像
docker tag      给镜像打标签
docker build    构建镜像

6:docker容器的常用命令

docker  run 创建并启动容器
     例子:docker run  -d -it -p 80:80  nginx:latest
docker  create  创建容器 --name
docker  start   启动容器
docker  stop    停止容器
docker  restart 重启容器
docker  kill    强制停止容器
docker  ps      查看容器列表  -a 查看所有容器
docker  rm      删除容器
docker  logs    查看日志
docker  commit  提交为镜像
docker  cp      拷贝文件
    批量删除所有容器 docker rm -f `docker ps -a -q`
docker  exec   进入正在运行的容器(分配一个新终端)
       例子: docker exec  -it  容器id/容器名字   /bin/bash(/bin/sh)
docker attach  进入正在运行的容器(使用相同的终端),偷偷离开的快捷键ctrl +p,ctrl +q
docker system prune 清理关闭的容器

容器想要放在后台一直运行的化,那么容器的初始命令,必须夯住(前台运行),否则容器就会退出.
前台运行
nginx -g 'daemon off;'
/usr/sbin/php-fpm --nodaemonize
systemctl cat 服务名称  >>查看启动方式

7:docker端口映射

docker run
-p  宿主机端口:容器端口
-p  宿主机ip1:宿主机端口:容器端口 (多个容器同时使用80端口)
-p  宿主机ip1::容器端口   随机端口映射
-p  宿主机ip1::容器端口/udp   使用udp协议做随机端口映射
-p 80:80  -p 3306:3306
-p 1111-1119:1111-1119  端口范围映射
-P  随机端口映射

8:docker数据卷

docker run
-v  宿主机绝对目录:容器目录
-v  容器目录        #创建一个随机卷,来持久化容器的目录下的数据
-v  卷名:容器目录    #创建一个固定名字的卷,来持久化容器的目录下的数据
--volumes-from  跟某一个容器挂载所有相同的卷

9:手动制作docker镜像

制作一个基于centos6系统的nginx镜像(单服务)

1:启动一个纯净的centos:6.9容器,安装nginx
echo '192.168.12.201  mirrors.aliyun.com' >>/etc/hosts
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum install nginx -y
2:把安装好服务的容器,提交为镜像
docker container commit eb109f194821 centos6.9_nginx:v1

3:测试镜像的功能
docker run -d  -p 82:80 centos6.9_nginx:v1 nginx -g 'daemon off;'

制作一个基于centos6系统的kod网盘的镜像(多服务)

1:启动一个centos6.9_nginx:v1,再安装php
echo '192.168.12.201  mirrors.aliyun.com' >>/etc/hosts
yum install php-fpm php-gd php-mbstring -y
vi /etc/php-fpm.d/www.conf
service php-fpm start
cd /etc/nginx/conf.d/
vi default.conf 
mkdir /html
cd /html
wget http://192.168.19.200/191127/kodexplorer4.40.zip
curl -o kodexplorer4.40.zip http://192.168.19.200/191127/kodexplorer4.40.zip
yum install unzip -y
unzip kodexplorer4.40.zip 
chown -R nginx:nginx .

vi /init.sh
#!/bin/bash

service php-fpm start
nginx -g 'daemon off;'

2:把安装好服务的容器,提交为镜像
docker commit 47208e3e3796 kod:v2
3:测试镜像的功能
docker run -d -p 83:80 kod:v2 /bin/bash /init.sh

制作一个基于centos7系统的nginx+sshd双服务镜像

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum install nginx -y
yum install openssh-server -y
yum install initscripts -y
/usr/sbin/sshd-keygen
echo '123456'|passwd --stdin root
/usr/sbin/sshd -D
vi /init.sh

10:自动制作docker镜像

  • dockerfile常用指令
FROM     基础镜像
RUN      制作镜像过程中需要的执行命令(安装服务)
CMD      容器启动的时候执行的初始命令,容易被替换(启动服务)
ENTRYPOINT 容器启动的时候执行的初始命令,不能被替换,如果同时使用CMD和ENTRYPOINT,cmd命令将作为ENTRYPOINT命令的参数
ADD      把dockerfile当前目录下的文件拷贝到容器中(自动解压tar包)
COPY     把dockerfile当前目录下的文件拷贝到容器中(不解压tar包)
WORKDIR  指定容器的默认工作目录
EXPOSE   镜像要暴露的端口
VOLUME   持久化卷
ENV      环境变量(ssh的密码,数据库的密码)
LABEL    镜像的属性标签
MAINTAINER 管理者标识
  • dockerfile自动构建镜像的思路
a: 手动制作docker镜像,记录历史命令
b:根据历史命令编写dockerfile文件
c:docker build构建docker镜像
d:测试镜像的功能
  • dockerfile单服务例子:
FROM centos:6.9
RUN echo '192.168.19.200 mirrors.aliyun.com' >>/etc/hosts
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;"]
  • dockerfile多服务例子:
FROM centos6.9_nginx:v1
RUN yum install php-fpm php-gd php-mbstring -y
ADD www.conf /etc/php-fpm.d/www.conf
ADD default.conf /etc/nginx/conf.d/default.conf
RUN mkdir /html
WORKDIR /html
RUN curl -o kodexplorer4.40.zip http://192.168.19.200/191127/kodexplorer4.40.zip
RUN yum install unzip -y
RUN unzip kodexplorer4.40.zip
RUN chown -R nginx:nginx .
ADD init.sh  /init.sh
CMD ["/bin/bash","/init.sh"]

vi /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"]

vi init.sh
#!/bin/bash
if [ -z $SSH_PWD ];then
 SSH_PWD=$1
fi
echo $SSH_PWD|passwd --stdin root
nginx
/usr/sbin/sshd -D

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

在这里插入图片描述

12:dockerfile的优化

a: 使用体积小的linux镜像alpine
b:尽可能的清理无用的缓存文件
c:修改dockerfile的时候,尽可能把修改的内容放在最后
d:使用.dockerignore忽略构建docker镜像时,不需要的文件

13:容器间的互联

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:单机版的容器编排

yum install  docker-compose  -y(需要epel源)
必须以docker-compose.yml或者docker-compose.yaml命名
version: '3'

services:
   mysql-server:
     image: mysql:5.7
     restart: always
	 volumes:
       - db_data:/var/lib/mysql
     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   停止服务

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
{
  "registry-mirrors": ["https://blhqq9ju.mirror.aliyuncs.com"],
  "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
删除镜像
1)进入docker registry的容器中
docker exec -it registry /bin/sh
2) 删除repo
rm -fr /var/lib/registry/docker/registry/v2/repositories/nginx
3) 清楚掉blob
registry garbage-collect /etc/docker/registry/config.yml

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: 192.168.209.133
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
报错:✖ Need to install docker-compose(1.18.0+) by yourself first and run this script again
解决: yum install -y docker-compose

在这里插入图片描述

# 查看docker配置信息
[root@k8s-master opt]# docker info
# docker配置仓库地址
[root@k8s-master opt]# cat /etc/docker/daemon.json 
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["192.168.209.133"]
}
#推送镜像、拉取镜像
docker images
docker tag SOURCE_IMAGE[:TAG] x.x.x.x/library/IMAGE[:TAG]
docker push x.x.x.x/library/IMAGE[:TAG]
docker pull x.x.x.x/library/IMAGE[:TAG]

在这里插入图片描述
在这里插入图片描述

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模板

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值