Docker笔记

Docker

容器的发展

Docker笔记_第1张图片

1、一个物理机可以部署多个app
2、每个app可以独立允许在一个vm里面
3、优点:

资源池:一个物理机的资源分配到了不同的虚拟机里面
容易扩展:加物理机器+虚拟机
容易云华:阿里云,直接在云上创建虚拟机然后运行app就可以了,不需要底层硬件的支持

4、缺点:
每一个虚拟机器都是一个完整的OS,要给其分配资源,当虚拟机数量增多时,OS本身消耗的资源势必增多
开发人员的不同技术栈需要不同的开发环境;开发人员和运维人员的环境不同,可能会出现问题。

5、解决:
容器打包app可以使得这个app运行在任何环境上。
在开发和运维之间搭建了一个桥梁,是实现devops的最佳解决方案
Docker笔记_第2张图片
Docker笔记_第3张图片

可以将应用程序自动部署到容器
解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术
docker理念: 一次封装,到处运行【DevOps:开发自运维,一次封装,到处运行】
官网:http://www.docker-cn.com/

Docker的基本组成

Docker Client客户端
Docker Daemon守护进程
Docker是CS架构,Docker客户端向服务器端也就是守护进程发出请求,守护进程处理完所有的工作并返回结果,可以本地访问也可以远程访问
Docker Image镜像
Docker Container容器:通过镜像启动
Docker Register仓库

Docker镜像加载原理:

docker的镜像实际上是由一层层的文件系统组成,这种层级的文件系统UnionFS。
UnionFS[联合文件系统]:Union文件系统UnionFS是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像[无父镜像],可以制作各种具体的应用镜像。
UnionFS特征:一次同时加载多个文件系统,单从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样只能看到最终的文件
Docker镜像的特点
Docker镜像的特点:Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作“容器层”,“容器层”之下都叫“镜像层”
Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟
Docker仓库
集中存放、分发镜像文件的场所。如Docker Hub 和 Docker Cloud
仓库和仓库注册服务器是由区别的。
仓库注册服务器上往往存放着多个仓库,每个仓库中会包含同一个软件的不同版本的镜像,每个镜像有不同的标签,标签就对应该软件的不同版本。如果不给出标签,默认latest作为默认标签32
仓库分为公开仓库和私有仓库两种形式。最大的公开仓库是DockerHub,存放了数量庞大的镜像供用户下载。默认情况下Docker会到Docker中央仓库寻找镜像文件,当然,可以修改配置指定其他仓库比如私有仓库等去寻找

容器和虚拟机的区别
虚拟机技术是虚拟出一套硬件之后,在其上运行了一个完整的OS,在该系统上运行所需的进程

而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,也没有进行硬件虚拟。因此容器要比传统虚拟机更加轻便

每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源

Linux容器并不是模拟一个完整的操作系统,而是对进程进行隔离。容器将软件运行所需的所有资源打包到一个隔离的容器中。容器和虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此变得高效轻量并保证部署在任何环境中的软件都能运行。也就是值打包了内核+库资源+设置+软件:
容器VS虚拟机

Docker安装

Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker

[root@localhost ~]# uname -r
3.10.0-1127.el7.x86_64

安装需要的软件包(yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的)
[root@localhost ~]# sudo yum install -y yum-utils device-mapper-persistent-data lvm2

设置yum源(一定要换,否则下载会很慢)
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

查看所有仓库中所有docker版本
yum list docker-ce --showduplicates | sort -r
#安装的是最新稳定版
[root@localhost ~]# yum install docker-ce -y
#安装指定版本docker-ce-18.06.0.ce
[root@localhost ~]# yum install docker-ce-18.06.0.ce -y

启动并加入开机启动
[root@localhost ~]# sudo systemctl start docker
[root@localhost ~]# sudo systemctl enable docker
验证安装是否成功
[root@localhost ~]# docker version
Client: Docker Engine - Community
Version: 20.10.2
API version: 1.41
Go version: go1.13.15
Git commit: 2291f61
Built: Mon Dec 28 16:17:48 2020
OS/Arch: linux/amd64
Context: default
Experimental: true

Server: Docker Engine - Community
Engine:
Version: 20.10.2
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: 8891c58
Built: Mon Dec 28 16:16:13 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.3
GitCommit: 269548fa27e0089a8b8278fc4fc781d7f65a939b
runc:
Version: 1.0.0-rc92
GitCommit: ff819c7e9184c13b7c2607fe6c30ae19403a7aff
docker-init:
Version: 0.19.0
GitCommit: de40ad0

Docker镜像加速器

这里设置的阿里云镜像加速器、否则拉取镜像特慢;
Docker笔记_第4张图片

Docker 常用命令

docker ps 查看部署进程
docker ps -a 查看部署
docker exec -it 173d176e2643 bash 进入nginx
发现vi或者vim命令没有用,解决办法:apt-get update 完成之后 apt-get install vim
docker stop 173d176e2643 停止
docker start 173d176e2643 重启
docker rm 173d176e2643 删除
1.查看当前运行的所有容器
docker ps -a
2.停止所有容器(container),这样才能够删除其中的images:
docker stop $(docker ps -a -q)
3.如果想要删除所有容器(container)的话再加一个指令:
docker rm $(docker ps -a -q)
4.查看当前有那些镜像(images)
docker images
5.删除镜像(images),通过镜像(images)的id来指定删除谁
docker rmi
6.想要删除镜像(images)id为的image的话可以用
docker rmi $(docker images | grep “^” | awk “{print $3}”)
7.要删除全部镜像(images)的话
docker rmi $(docker images -q)
docker update --restart=always 开机自启镜像
cat /var/lib/docker/containers/66f2d52cfeec4891c0cd4b1 日志位置
docker images 查看本地镜像
docker images -a 列出所有
docker images -q 显示ID
docker images --no-trunc 不截取ID显示
REPOSITORY 仓库 TAG标签 IMAGE ID CREATED 创建时间 SIZE 大小
tomcat latest 57c97f91f49a 40 hours ago 654MB
jenkins/jenkins latest eddee8192312 3 days ago 717MB
nginx latest bc9a0695f571 2 weeks ago 133MB

导入导出镜像

docker images 查看
docker save mysql > mysql-docker.tar 导出
docker load < mysql-docker.tar 导入
已运行容器进行重新打包
docker ps 查看ID
docker commit -a=“anmeng” -m=“anmeng’zhichitongbu” e8f715f8f94a vsftpd:anmeng
说明:
-a 作者
-m 为描述信息
ID:e8f715f8f94a
vsftpd:anmeng 镜像名称

修改容器内容

docker exec -it jms_all bash 进入jms_all容器
docker conmmit jms_all01 jumpserver:jms_all01 提交为新镜像数据持久化
docker run -d --name jms_all01-1 jumpserver:jms_all01 启动新容器
docker cp 文件名 jms_all:/ 拷贝文件到镜像根目录下
docker exec -it jms_all ls / 查看是否拷贝完成
将宿主机数据挂载到容器里
Docker笔记_第5张图片

1、volume
1、 创建数据卷:docker volume create nginx-vol
2、 查看数据卷:docker volume ls
3、 查看某容器挂载点创建时间等:docker volume inspect jms_all
Docker笔记_第6张图片
4、 用卷创建一个容器
docker run -p 8080:80 -d --name nginx01 --mount src=nginx_vol,dst=/usr/share/nginx/html nginx
5、 查看使用的数据卷目标:docker inspect nginx01 | more
“Mounts”: [
{
“Type”: “volume”,
“Name”: “nginx_vol”,
“Source”: “/var/lib/docker/volumes/nginx_vol/_data”,
“Destination”: “/usr/share/nginx/html”,
“Driver”: “local”,
“Mode”: “z”,
“RW”: true,
“Propagation”: “”
[root@localhost ~]# ls /var/lib/docker/volumes/nginx_vol/_data
50x.html index.html
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# cd /var/lib/docker/volumes/nginx_vol/_data/
[root@localhost _data]# vim index.html
6、 停止或删除nginx01、启用nginx02挂载01数据卷
docker stop nginx01
docker rm nginx01
docker run -p 9090:80 -d --name nginx02 --mount src=nginx_vol,dst=/usr/share/nginx/html nginx
7、 删除数据卷
docker volume rm nginx_vol
8、 老方式
docker run -d --name nginx02 -p 8088:80 -v nginx:/usr/share/nginx/html nginx
9、 没有指定卷自动创建、建议使用–mount、更通用;
2、Bind Mounts
将宿主机文件或者目录挂载到容器中
1、 挂载宿主机etc目录到容器opt下目录(注意用于绑宿主机文件操作会实时同步)
docker run -p 9090:80 -d --name nginx02 --mount type=bind,src=/etc,dst=/opt nginx
Docker笔记_第7张图片

容器网络原理

1、 网络模式
Docker笔记_第8张图片

创建一个网络
docker network create bs-test
指定网络bs-test
docker run -it --name bs4 --net bs-test busybox
docker run -it --name bs3 --net bs-test busybox
bs4/bs3互ping通

2、 容器网络访问原理
1、veth虚拟设备对原理类似linux管道
Docker笔记_第9张图片

DNAT\SNAT

Docker笔记_第10张图片
可以使用iptables -vnL或iptables-save查看规则
查看路由表route

如部署jumpserver堡垒机

生成随机加密秘钥, 勿外泄
mysql 起jumpserver库
yum install -y redis
vim /etc/redis.conf
61:bind 0.0.0.0
480:requirepass 123
systemctl start redis
systemctl enable redis
#生成随机加密秘钥,建立容器的时候要用
$ if [ “ S E C R E T K E Y " = " " ] ; t h e n S E C R E T K E Y = ‘ c a t / d e v / u r a n d o m ∣ t r − d c A − Z a − z 0 − 9 ∣ h e a d − c 50 ‘ ; e c h o " S E C R E T K E Y = SECRET_KEY" = "" ]; then SECRET_KEY=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 50`; echo "SECRET_KEY= SECRETKEY"=""];thenSECRETKEY=cat/dev/urandomtrdcAZaz09∣headc50‘;echo"SECRETKEY=SECRET_KEY” >> ~/.bashrc; echo $SECRET_KEY; else echo $SECRET_KEY; fi
$ if [ “ B O O T S T R A P T O K E N " = " " ] ; t h e n B O O T S T R A P T O K E N = ‘ c a t / d e v / u r a n d o m ∣ t r − d c A − Z a − z 0 − 9 ∣ h e a d − c 16 ‘ ; e c h o " B O O T S T R A P T O K E N = BOOTSTRAP_TOKEN" = "" ]; then BOOTSTRAP_TOKEN=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 16`; echo "BOOTSTRAP_TOKEN= BOOTSTRAPTOKEN"=""];thenBOOTSTRAPTOKEN=cat/dev/urandomtrdcAZaz09∣headc16‘;echo"BOOTSTRAPTOKEN=BOOTSTRAP_TOKEN” >> ~/.bashrc; echo $BOOTSTRAP_TOKEN; else echo $BOOTSTRAP_TOKEN; fi

docker run --name jms_all -d -v /opt/mysql:/var/lib/mysql -v /opt/jumpserver:/opt/jumpserver/data/media -p 8888:80 -p 2222:2222 -e SECRET_KEY=cbAnqokTG695KXuTMcFK4cQYWMpCyUmtVwLLCrABhylNDYbao3 -e BOOTSTRAP_TOKEN=Wly0eqjL5EZSJKPZ -e DB_HOST=192.168.5.242 -e DB_PORT=3306 -e DB_USER=root -e DB_PASSWORD=root123 -e DB_NAME=jumpserver -e REDIS_HOST=192.168.5.242 -e REDIS_PORT=6379 -e REDIS_PASSWORD=123 jumpserver/jms_all:1.4.8
默认账号:admin 密码admin

上述命令解释
docker run --name jms_all -d
-v /opt/mysql:/var/lib/mysql
-v /opt/jumpserver:/opt/jumpserver/data/media
-p 8888:80 \ #端口映射
-p 2222:2222
-e SECRET_KEY=dL5gQbSWwHhiAktXqYeCkyAzMbJqNtHa1Y9R2NjeFl7j8mzQXu
-e BOOTSTRAP_TOKEN=AWHHuSbqkUi4mItZ
-e DB_HOST=192.168.0.241 \ #当前主机IP
-e DB_PORT=3306
-e DB_USER=jumpserver \ #数据库用户
-e DB_PASSWORD=linux123 \ #数据库密码
-e DB_NAME=jumpserver \ #数据库名称
-e REDIS_HOST=192.168.0.241
-e REDIS_PORT=6379
-e REDIS_PASSWORD=123 \ #Redis密码
jumpserver/jms_all:1.4.8

FTP测试

账号admin密码admin 数据放本地/data/ftpData下持久化
1、创建容器
docker run -d -p 20:20 -p 21:21 -p 21100-21110:21100-21110 -v /home/ftp :/home/vsftpd
-e FTP_USER=admin -e FTP_PASS=admin -e PASV_ADDRESS=192.168.1.66
-e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110
–name vsftpd --restart=always fauria/vsftpd
3、 测试删除容器是否数据还在
docker stop vsftpd
docker rm vsftpd
测试无法登录
恢复测试
docker run -d -p 20:20 -p 21:21 -p 21100-21110:21100-21110 -v /data/ftpData:/home/vsftpd
-e FTP_USER=admin -e FTP_PASS=admin -e PASV_ADDRESS=192.168.5.242
-e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110
–name vsftpd --restart=always fauria/vsftpd
查看数据是否还在

测试邮箱搭建

docker pull bestwu/ewomail 拉取镜像
docker run -d -h mail.ewomail.com --restart=always
-p 25:25
-p 109:109
-p 110:110
-p 143:143
-p 465:465
-p 587:587
-p 993:993
-p 995:995
-p 80:80
-p 8080:8080
-v pwd/mysql/:/ewomail/mysql/data/
-v pwd/vmail/:/ewomail/mail/
-v pwd/ssl/certs/:/etc/ssl/certs/
-v pwd/ssl/private/:/etc/ssl/private/
-v pwd/rainloop:/ewomail/www/rainloop/data
-v pwd/ssl/dkim/:/ewomail/dkim/
–name ewomail bestwu/ewomailserver

邮箱管理后台http://localhost:8080
Rainloop 管理端 http://localhost/?admin
Rainloop 用户端 http://localhost

邮箱管理后台http://localhost:8080 账号 admin 密码 ewomail123
Rainloop 管理端 http://localhost/?admin 账号密码在邮箱管理后台添加设置
Rainloop 用户端 http://localhost 账号密码在邮箱管理后台添加设置

常用数据库部署(测试)

1、部署Mysql5.7
搜索:docker search mysql
拉取:docker pull mysql:5.7
df -h:查看本地最大目录
创建目录:mkdir /home/mysql(数据放本地)
创建容器:docker run -p 3306:3306 --name mysql -v /home/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Anmit_2005 -d mysql:5.7
可以尝试删除数据库在恢复
这里测试的全部停止后删除
1、 docker stop $(docker ps -a -q) 全部停止
2、docker rm $(docker ps -a -q) 全部删除
3、测试连接连接MySQL失败
4、恢复测试:docker run -p 3306:3306 --name mysql -v /home/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=nihao123! -d mysql:5.7
5、测试连接MySQL数据还在
查看MySQL数据:ls /home/mysql/

文件夹中多出了很多关于mysql的内容,这就证明我们的数据已经被挂到本地了,当我们重新创建新的mysql容器的时候只要将本地的地址指向这个地址,我们新的mysql容器就会有之前mysql的所有数据了,这样就再也不怕我们的mysql数据因为容器的销毁而丢失了。

2、部署Mysql8.0
这个命令以后,虽然mysql正常启动了,但是无法远程连接,这里就是因为mysql8.0本身的问题了,和docker无关,以下是解决方案
1、docker run -p 3306:3306 --name mysql8.0 -v /home/mysql8.0:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=nihao123! -d mysql:8.0
[root@localhost mysql-2]# docker exec -it mysql8.0 bash
root@daedd09fa1fd:/# ls
bin boot dev docker-entrypoint-initdb.d entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@daedd09fa1fd:/# mysql -uroot -pAnmit_2005
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.23 MySQL Community Server - GPL
Copyright © 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
mysql> GRANT ALL ON . TO ‘root’@‘%’; (授权远程登录)
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges; (刷新权限)
Query OK, 0 rows affected (0.01 sec)
mysql> ALTER USER ‘root’@‘localhost’ IDENTIFIED BY ‘password’ PASSWORD EXPIRE NEVER; (更改加密规则)
Query OK, 0 rows affected (0.00 sec)
mysql> ALTER USER ‘root’@‘%’ IDENTIFIED WITH mysql_native_password BY ‘Anmit_2005’; (更改密码)
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges; (刷新权限)
Query OK, 0 rows affected (0.01 sec)
ALTER USER ‘用户名’@‘%’ IDENTIFIED WITH mysql_native_password BY ‘密码’;
mysql> exit
exit退出
3、部署Oracle11
1、docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
2、docker run -d -p 1522:1521 -v /home/oracle:/home/oracle --name oracle11g
3、[root@localhost ~]# docker exec -it oracle11g bash
[oracle@387a92c33226 /]$ su root
Password: helowin
[root@387a92c33226 /]# ls
bin boot dev etc home lib lib64 media mnt opt proc root sbin selinux srv sys tmp usr var
[root@387a92c33226 /]# vi etc/profile
最下面添加环境变量
export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
export ORACLE_SID=helowin
export PATH=$ORACLE_HOME/bin:PATH

[root@387a92c33226 /]# ln -s KaTeX parse error: Expected 'EOF', got '#' at position 66: …387a92c33226 /]#̲ [root@387a92c… sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on Mon Mar 15 11:49:15 2021
Copyright © 1982, 2009, Oracle. All rights reserved.
SQL> conn /as sysdba
Connected.
SQL> alter user system identified by system; (修改密码)
User altered.
SQL> alter user sys identified by sys;
User altered.
SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
Profile altered.
SQL> create admin test identified by admin; (创建用户)
User created.
SQL> grant connect,resource,dba to test;
Grant succeeded.
SQL>
4、部署postgresSQL
1、docker pull postgres
2、docker run --name postgres -v /home/postgres:/var/lib/postgresql/data -e POSTGRES_PASSWORD=Anmit_2005 -p 5432:5432 -d postgres
以下是可视WEB管理
docker run --name pgadmin -p 5080:80 -e ‘[email protected]’ -e ‘PGADMIN_DEFAULT_PASSWORD=Anmit_2005’ -e ‘PGADMIN_CONFIG_ENHANCED_COOKIE_PROTECTION=True’ -e ‘PGADMIN_CONFIG_LOGIN_BANNER=“Authorised users only!”’ -e ‘PGADMIN_CONFIG_CONSOLE_LOG_LEVEL=10’ -d dpage/pgadmin4:4.17

构建业务基础镜像

Dockerfile打包
Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取中的指令自动生成映像。
docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。
Dockerfile的基本结构
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。
Dockerfile文件说明
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。

常用的指令

FROM:指定基础镜像,必须为第一个命令
MAINTAINER: 维护者信息
RUN:构建镜像时执行的命令
ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
CMD:构建容器后调用,也就是在容器启动时才进行调用。
ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
LABEL:用于为镜像添加元数据
ENV:设置环境变量
EXPOSE:指定于外界交互的端口
VOLUME:用于指定持久化目录
WORKDIR:工作目录,类似于cd命令
USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
ARG:用于指定传递给构建运行时的变量
ONBUILD:用于设置镜像触发器

如构建Nginx基础镜像

如:vim Dockerfile-nginx
FROM centos:7
MAINTAINER www.ctnrs.com
RUN yum install -y gcc gcc-c++ make
openssl-devel pcre-devel gd-devel
iproute net-tools telnet wget curl &&
yum clean all &&
rm -rf /var/cache/yum/*
RUN wget http://nginx.org/download/nginx-1.15.5.tar.gz &&
tar zxf nginx-1.15.5.tar.gz &&
cd nginx-1.15.5 &&
./configure --prefix=/usr/local/nginx
–with-http_ssl_module
–with-http_stub_status_module &&
make -j 4 && make install &&
rm -rf /usr/local/nginx/html/* &&
echo “ok” >> /usr/local/nginx/html/status.html &&
cd / && rm -rf nginx-1.12.2* &&
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV PATH $PATH:/usr/local/nginx/sbin
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
WORKDIR /usr/local/nginx
EXPOSE 80
CMD [“nginx”, “-g”, “daemon off;”]
docker build -t nginx:v1 -f Dockerfile-nginx . 开始构建
docker run -d --name nginx01 -p 88:80 nginx:v1 启用容器

如构建PHP基础镜像

FROM centos:7
MAINTAINER www.ctnrs.com
RUN yum install epel-release -y &&
yum install -y gcc gcc-c++ make gd-devel libxml2-devel
libcurl-devel libjpeg-devel libpng-devel openssl-devel
libmcrypt-devel libxslt-devel libtidy-devel autoconf
iproute net-tools telnet wget curl &&
yum clean all &&
rm -rf /var/cache/yum/*

RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz &&
tar zxf php-5.6.36.tar.gz &&
cd php-5.6.36 &&
./configure --prefix=/usr/local/php
–with-config-file-path=/usr/local/php/etc
–enable-fpm --enable-opcache
–with-mysql --with-mysqli --with-pdo-mysql
–with-openssl --with-zlib --with-curl --with-gd
–with-jpeg-dir --with-png-dir --with-freetype-dir
–enable-mbstring --with-mcrypt --enable-hash &&
make -j 4 && make install &&
cp php.ini-production /usr/local/php/etc/php.ini &&
cp sapi/fpm/php-fpm.conf /usr/local/php/etc/php-fpm.conf &&
sed -i “90a \daemonize = no” /usr/local/php/etc/php-fpm.conf &&
mkdir /usr/local/php/log &&
cd / && rm -rf php* &&
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV PATH $PATH:/usr/local/php/sbin
COPY php.ini /usr/local/php/etc/
COPY php-fpm.conf /usr/local/php/etc/
WORKDIR /usr/local/php
EXPOSE 9000
CMD [“php-fpm”]

docker build -t php:v1 -f Dockerfile-php . 开始构建

如构建Tomcat基础镜像

FROM centos:7
MAINTAINER www.ctnrs.com
ENV VERSION=8.5.63
RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y &&
yum clean all &&
rm -rf /var/cache/yum/*
#RUN wget http://192.168.31.211/apache-tomcat-KaTeX parse error: Expected 'EOF', got '&' at position 18: …ERSION}.tar.gz &̲& \ #RUN wget h…{VERSION}/bin/apache-tomcat-KaTeX parse error: Expected 'EOF', got '&' at position 18: …ERSION}.tar.gz &̲& \ COPY apache…{VERSION}.tar.gz &&
mv apache-tomcat-KaTeX parse error: Expected 'EOF', got '&' at position 29: …r/local/tomcat &̲& \ rm -rf …{VERSION}.tar.gz /usr/local/tomcat/webapps/* &&
mkdir /usr/local/tomcat/webapps/test &&
echo “ok” > /usr/local/tomcat/webapps/test/status.html &&
sed -i ‘1a JAVA_OPTS=“-Djava.security.egd=file:/dev/./urandom”’ /usr/local/tomcat/bin/catalina.sh &&
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV PATH $PATH:/usr/local/tomcat/bin
WORKDIR /usr/local/tomcat
EXPOSE 8080
CMD [“catalina.sh”, “run”]

docker build -t tomcat:v1 -f Dockerfile-tomcat . 开始构建
docker run -d --name tomcat01 -p 8089:8080 tomcat:v1 拉取访问测试
构建项目测试
#vi Dockerfile
FROM tomcat:v1
COPY jenkins.war /usr/local/tomcat/webapps/ROOT.war 复制jenkins.war到tomcat下
#docker build -t tomcat:v2 -f Dockerfile 开始构建
#docker run -d --name tomcat02 -p 8088:8080 tomcat:v2 拉取访问测试jenkins

如部署LNMP网站平台

1、 自定义网络lnmp
docker network create lnmp
2、 创建MySQL容器
#docker run -d --name lnmp_mysql --net lnmp --mount src=mysql-vol,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress mysql:5.7 --character-set-server=utf8
#ls /var/lib/docker/volumes/mysql-vol/_data/
auto.cnf client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem
ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys
ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem wordpress

3、 创建PHP容器
#docker run -d --name lnmp_php --net lnmp --mount src=wwwroot,dst=/wwwroot php:v1
#docker volume ls
local mysql-vol
local wwwroot
4、 创建Nginx容器
#docker run -d --name lnmp_nginx --net lnmp -p 8000:80 --mount type=bind,src=$(pwd)/nginx.conf,dst=/usr/local/nginx/conf/nginx.conf --mount src=wwwroot,dst=/wwwroot nginx:v1
docker ps | grep lnmp
e7804c3d5d5e nginx:v1 “nginx -g 'daemon of…” 17 seconds ago Up 16 seconds 0.0.0.0:8000->80/tcp lnmp_nginx
495632114f85 php:v1 “php-fpm” 11 minutes ago Up 11 minutes 9000/tcp lnmp_php
01576dacf2ab mysql:5.7 “docker-entrypoint.s…” 18 minutes ago Up 18 minutes 3306/tcp, 33060/tcp lnmp_mysql
5、 测试网站
#cd /var/lib/docker/volumes/wwwroot/_data/
#vi test.php

访问测试:http://0.0.0.0:8000/test.php
6、 以wordpress博客为例
https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
解压到 /var/lib/docker/volumes/wwwroot/_data/下、记得改读写权限777
#docker exec -it lnmp_nginx bash
cd logs/
tail www.ctnrs.com_access.log -f
测试访问:http://0.0.0.0:8000/wordpress/wp-admin/profile.php

创建容器常用选项

Docker笔记_第11张图片

容器硬件资源限制

Docker笔记_第12张图片
如限制NAMES jms_all镜像使用2颗CPU、内存限制2.5g : docker container update jms_all --cpus=“2” --memory=“2.5g” --memory-swap=“-1”
查看jms_all镜像限制:docker stats --no-stream jms_all 实时查看去掉–no-stream

docker-compose单机集群管理工具

5秒部署10个nginx
(注意物理内存、一条命令下去机器会宕掉的)
docker-compose 容器的单机集群管理工具 python编写的工具
docker-compose的安装
yum -y install epel-release
yum -y install python-pip3
pip3 install docker-compose
docker-compose模板文件是定义服务、网络和数据卷的yaml文档
root@localhost ~]# cd /opt/
[root@localhost opt]# mkdir docker-compose
[root@localhost opt]# cd docker-compose/
[root@localhost docker-compose]# ls
[root@localhost docker-compose]# vim docker-compose.yml
-bash: vim: 未找到命令
[root@localhost docker-compose]# vi docker-compose.yml
[root@localhost docker-compose]# vim docker-compose.yml

比如一下启动1个nginx 10个tomact 5个mysql
Docker笔记_第13张图片
docker-compose常用命令
docker-compose up -d 启动 vim docker-compose.yml
docker-compose up -d --scale ssh=10 启动10个ssh服务
docker-compose down 全部停止删除
docker-compose up -d --scale ssh=5 --scale nginx=3
docker-compose ps 查看compose 创建的进程
docker-compose logs 查看compose启动相关日志
docker-compose top 查看运行的进程

Harbor私有镜像仓库

Harbor简介

Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
Harbor特性
基于角色的访问控制 :用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
镜像复制 : 镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。
图形化用户界面 : 用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。
AD/LDAP 支持 : Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
审计管理 : 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
国际化 : 已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。
RESTful API : RESTful API 提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。
部署简单 : 提供在线和离线两种安装工具, 也可以安装到vSphere平台(OVA方式)虚拟设备。
Harbor组件,Harbor在架构上主要由6个组件构成:
Proxy:Harbor的registry, UI, token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。
Registry: 负责储存Docker镜像,并处理docker push/pull 命令。由于我们要对用户进行访问控制,即不同用户对Docker image有不同的读写权限,Registry会指向一个token服务,强制用户的每次docker pull/push请求都要携带一个合法的token, Registry会通过公钥对token 进行解密验证。
Core services: 这是Harbor的核心功能,主要提供以下服务:
UI:提供图形化界面,帮助用户管理registry上的镜像(image), 并对用户进行授权。
webhook:为了及时获取registry 上image状态变化的情况, 在Registry上配置webhook,把状态变化传递给UI模块。
token 服务:负责根据用户权限给每个docker push/pull命令签发token. Docker 客户端向Regiøstry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。
Database:为core services提供数据库服务,负责储存用户权限、审计日志、Docker image分组信息等数据。
Job Services:提供镜像远程复制功能,可以把本地镜像同步到其他Harbor实例中。
Log collector:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。

Harbor实现
Harbor的每个组件都是以Docker容器的形式构建的,官方也是使用Docker Compose来对它进行部署。用于部署Harbor的Docker Compose模板位于 harbor/docker-compose.yml,打开这个模板文件,发现Harbor是由7个容器组成的;

nginx:nginx负责流量转发和安全验证,对外提供的流量都是从nginx中转,所以开放https的443端口,它将流量分发到后端的ui和正在docker镜像存储的docker registry。
harbor-jobservice:harbor-jobservice 是harbor的job管理模块,job在harbor里面主要是为了镜像仓库之前同步使用的;
harbor-ui:harbor-ui是web管理页面,主要是前端的页面和后端CURD的接口;
registry:registry就是docker原生的仓库,负责保存镜像。
harbor-adminserver:harbor-adminserver是harbor系统管理接口,可以修改系统配置以及获取系统信息。
这几个容器通过Docker link的形式连接在一起,在容器之间通过容器名字互相访问。对终端用户而言,只需要暴露proxy (即Nginx)的服务端口。
harbor-db:harbor-db是harbor的数据库,这里保存了系统的job以及项目、人员权限管理。由于本harbor的认证也是通过数据,在生产环节大多对接到企业的ldap中;
harbor-log:harbor-log是harbor的日志服务,统一管理harbor的日志。通过inspect可以看出容器统一将日志输出的syslog。
这几个容器通过Docker link的形式连接在一起,这样,在容器之间可以通过容器名字互相访问。对终端用户而言,只需要暴露proxy (即Nginx)的服务端口。
Docker笔记_第14张图片

Harbor部署

建议迅雷下
wget -P /usr/local/src/ https://github.com/vmware/harbor/releases/download/v1.2.0/harbor-online-installer-v1.2.0.tgz
tar zxf harbor-online-installer-v1.2.0.tgz -C /usr/local/ 解压

cd /usr/local/harbor/
vim /usr/local/harbor/harbor.cfg
修改hostname = harbor (启动harbor为主机名)
./install.sh 安装
#vim /etc/docker/daemon.json
“registry-mirrors”: [“https://s9zq7nuw.mirror.aliyuncs.com”],
“insecure-registries”: [“http://192.168.1.110”]
#systemctl restart docker
#docker-compose up -d

访问:http://192.168.1.110/harbor/sign-in
默认账号密码: admin / Harbor12345 登录后修改密码
上传
#docker login http://192.168.1.110
Username: admin
Password: Harbor12345
#docker tag 60e5c0346614 192.168.1.110/library/jms_all
#docker push 192.168.1.110/library/jms_all

下拉
#docker pull 192.168.1.110/library/jms_all:latest

Prometheus+Grafana监控系统

zabbix在监控界占有不可撼动的地位,功能强大。但是对容器监控显得力不从心。为解决监控容器的问题,引入了prometheus技术。prometheus号称是下一代监控;
prometheus是由谷歌研发的一款开源的监控软件,目前已经被云计算本地基金会托管,是继k8s托管的第二个项目;
Prometheus(普罗米修斯)特点
Docker笔记_第15张图片
prometheus运行流程
Docker笔记_第16张图片
Docker笔记_第17张图片
两个概念
Docker笔记_第18张图片

监控的目的
google指出,监控分为白盒监控和黑盒监控之分。
白盒监控:通过监控内部的运行状态及指标判断可能会发生的问题,从而做出预判或对其进行优化。
黑盒监控:监控系统或服务,在发生异常时做出相应措施。
监控的目的如下:
 1、根据历史监控数据,对为了做出预测
 2、发生异常时,即使报警,或做出相应措施
 3、根据监控报警及时定位问题根源
 4、通过可视化图表展示,便于直观获取信息

prometheus部署

#mv prometheus.yml /tmp/
#docker run -d
–name=prometheus
-p 9090:9090
prom/prometheus

cAdvisor部署(被监控端)
Docker笔记_第19张图片
#docker run -d
–volume=/:/rootfs:ro
–volume=/var/run:/var/run:ro
–volume=/sys:/sys:ro
–volume=/var/lib/docker/:/var/lib/docker:ro
–volume=/dev/disk/:/dev/disk:ro
–publish=8080:8080
–detach=true
–name=cadvisor
google/cadvisor:latest

prometheus端添加decker服务器
#vim /tmp/prometheus.yml

  • job_name: “docker2”
    static_configs:
    • targets: [‘192.168.5.242:8080’]
      #docker restart prometheus
      测试http://192.168.1.110:9090/
      Docker笔记_第20张图片

可视化Grafana部署
#docker run -d
–name=grafana
-p 3000:3000
grafana/grafana

测试:http://192.168.1.110:3000/
账号admin密码admin 提示更改密码
导航栏添加数据源
Docker笔记_第21张图片
Docker笔记_第22张图片
添加仪表盘
Docker笔记_第23张图片
Docker笔记_第24张图片
Docker笔记_第25张图片
Docker笔记_第26张图片

Zabbix部署

1、 拉取相关镜像
docker pull mysql:5.7
docker pull zabbix/zabbix-server-mysql:centos-latest
docker pull zabbix/zabbix-web-nginx-mysql:latest
docker pull zabbix/zabbix-java-gateway:latest
2、 创建网络
docker network create -d bridge zabbix_net
3、 创建mysql容器
docker run -dit -p 3306:3306 --name zabbix-mysql --network zabbix_net --restart always -v /etc/localtime:/etc/localtime -v /home/zabbix/mysql:/var/lib/mysql -e MYSQL_DATABASE=“zabbix” -e MYSQL_USER=“zabbix” -e MYSQL_PASSWORD=“zabbix123” -e MYSQL_ROOT_PASSWORD=“root123” mysql:5.7
配置说明:
MYSQL_DATABASE=“zabbix” 在msql中创建的数据库的名
MYSQL_USER=“zabbix” 创建msql的登录账户名
MYSQL_PASSWORD=“zabbix123” 设置创建msql的登录账户的密码
MYSQL_ROOT_PASSWORD=“root123” 设置msql数据库root 的密码
–network zabbix_net是将容器加入到zabbix_net网络中,
-v /etc/localtime:/etc/localtime是同步服务器和容器内部的时区,
–restart always设置自启动,
-e MYSQL_DATABASE=“zabbix”,创建环境变量。
–name zabbix-mysql,给容器命名。

4、 创建zabbix-java-gateway容器
docker run -v /etc/localtime:/etc/localtime -dit --restart=always --name=zabbix-java-gateway --network zabbix_net zabbix/zabbix-java-gateway:latest

5、 运行zabbix-server-mysql镜像,创建zabbix-server-mysql容器
创建数据卷
#docker volume create zabbix-server-vol
#docker run -dit -p 10051:10051 --mount source=zabbix-server-vol,target=/etc/zabbix -v /etc/localtime:/etc/localtime -v /usr/lib/zabbix/alertscripts:/usr/lib/zabbix/alertscripts --name=zabbix-server-mysql --restart=always --network zabbix_net -e DB_SERVER_HOST=“zabbix-mysql” -e MYSQL_DATABASE=“zabbix” -e MYSQL_USER=“zabbix” -e MYSQL_PASSWORD=“zabbix123” -e MYSQL_ROOT_PASSWORD=“root123” -e ZBX_JAVAGATEWAY=“zabbix-java-gateway” zabbix/zabbix-server-mysql:centos-latest
说明:
此处的以下内容与 运行mysql 镜像,创建mysql容器设置的内容要一致
MYSQL_DATABASE=“zabbix”
MYSQL_USER=“zabbix”
MYSQL_PASSWORD=“zabbix123”
MYSQL_ROOT_PASSWORD=“root123”
6、 运行zabbix-web-nginx-mysql镜像,创建zabbix-web-nginx-mysql容器
docker run -dit -p 8080:8080 -v /etc/localtime:/etc/localtime --name zabbix-web-nginx-mysql --restart=always --network zabbix_net -e DB_SERVER_HOST=“zabbix-mysql” -e MYSQL_DATABASE=“zabbix” -e MYSQL_USER=“zabbix” -e MYSQL_PASSWORD=“zabbix123” -e MYSQL_ROOT_PASSWORD=“root123” -e ZBX_SERVER_HOST=“zabbix-server-mysql” zabbix/zabbix-web-nginx-mysql:latest
此处的以下内容与 运行mysql 镜像,创建mysql容器设置的内容要一致
MYSQL_DATABASE=“zabbix”
MYSQL_USER=“zabbix”
MYSQL_PASSWORD=“zabbix123”
MYSQL_ROOT_PASSWORD=“root123”

7、 检查容器
在这里插入图片描述
在浏览器中输入http://IP:8080/zabbix,打开zabbix首页,其中用户名密码分别是admin/zabbix。
Docker笔记_第27张图片

你可能感兴趣的:(docker,运维,容器)