02走进云计算-docker自动构建镜像
docker部署一个项目
端口映射
## inspect查看容器内部信息
[root@db01 ~]# docker inspect nginx:latest
-p 宿主机端口:容器端口
[root@db01 ~]# docker run -it -p 80:80 -d nginx
-p 宿主机IP:宿主机端口:容器端口
# 跟宿主同一网段的才可以访问
[root@db01 ~]# docker run -it -p 10.0.0.51:81:80 -d nginx
-P 随机端口
[root@db01 ~]# docker run -it -P -d nginx
## 映射多个端口
[root@db01 ~]# docker run -it -p 80:80 -p 3306:3306 -p 9000:9000 -d nginx
docker容器命令(部署小游戏)
## 启动nginx容器
[root@db01 ~]# docker run -it -d -p 80:80 nginx
## 拷贝指定文件到docker容器中
[root@db01 ~]# docker cp h5_games.zip 96dc3c8ce6b6:/opt
## 进入容器
[root@db01 ~]# docker exec -it 96dc3c8c /bin/bash
## 查看opt目录
root@96dc3c8ce6b6:/# ls /opt/
h5_games.zip
sed -i 's#/usr/share/nginx/html#/opt/h5_game#g' default.conf
## 重启容器
[root@db01 ~]# docker restart 96dc3c8ce6b6
# 虽然nginx配置文件改变了,但是game没有解压命令。我们可以使用以下挂载命令实现
文件映射
# 编写配置文件
[root@db01 h5_game]# vim /opt/default.conf
server {
listen 80;
server_name localhost;
location / {
root /opt/h5_game;
index index.html;
}
}
[root@db01 h5_game]# docker run -it \
-p 80:80 \
-v /opt/h5_game:/opt/h5_game \
-v /opt/default.conf:/etc/nginx/conf.d/default.conf \
-d nginx
# 可以访问游戏网站了
遇到的问题
原因:没有开启内核转发
## 临时开启
echo "1" > /proc/sys/net/ipv4/ip_forward
## 永久开启
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
手动制作docker镜像
# 1.启动一个纯净系统的镜像
[root@db01 ~]# docker run -it -d centos:7 /bin/bash
# 2.连接到容器中
[root@db01 ~]# docker exec -it 7f3783f2f56d /bin/bash
# 3.删除默认国外源
[root@7f3783f2f56d yum.repos.d]# rm -fr /etc/yum.repos.d/*
# 4.下载base源
[root@7f3783f2f56d yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 5.下载epel源
[root@7f3783f2f56d yum.repos.d]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
# 6.安装nginx
[root@7f3783f2f56d ~]# yum install -y nginx
# 7.优化Base源
sed -i '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
sed -i '/mirrors.cloud.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
# 8.修改配置文件
[root@7f3783f2f56d nginx]# sed -i 's#/usr/share/nginx/html#/opt/h5_game#g' /etc/nginx/nginx.conf
[root@7f3783f2f56d nginx]# sed -ri '43a\\tindex index.html;' /etc/nginx/nginx.conf
# 9.启动nginx
# 启动时传递参数
nginx -g "daemon off;"
# 10.部署代码
[root@db01 ~]# docker cp /opt/h5_game 7f3783f2f56d:/opt/
# 11.手动制作镜像
[root@db01 ~]# docker commit 容器ID 镜像名字:标签
[root@db01 ~]# docker commit 7f3783f2f56d centos_nginx:v1
## 12.导出镜像
[root@db01 ~]# docker save centos_nginx:v1 > c7_nginx_v1.tar.gz
## 13.导入镜像
[root@db02 ~]# docker load < c7_nginx_v1.tar.gz
## 14.启动镜像
[root@db02 ~]# docker run -it \
-p 80:80 \
-d centos_nginx:v1 \
nginx -g "daemon off;"
练习:制作一个wordpress的镜像
# 1.使用一个基础镜像
docker pull centos:7
# 2.启动一个容器
[root@db01 ~]# docker run -it centos:7 /bin/bash
# 3.在容器中部署想要的服务
## 1)换源
[root@3b91f49d39d6 /]# rm -fr /etc/yum.repos.d/*
[root@3b91f49d39d6 /]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@3b91f49d39d6 /]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
## 2)优化源
[root@3b91f49d39d6 /]# sed -i '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
[root@3b91f49d39d6 /]# sed -i '/mirrors.cloud.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
## 3)安装服务
[root@3b91f49d39d6 /]# yum install -y nginx
[root@3b91f49d39d6 /]# yum install -y mariadb-server
[root@db01 ~]# docker cp php.tgz 3b91f49d39d6:/opt
[root@3b91f49d39d6 opt]# tar xf php.tgz -C /opt
[root@3b91f49d39d6 opt]# yum localinstall *.rpm -y
[root@3b91f49d39d6 opt]# rm -fr /opt/*
[root@3b91f49d39d6 opt]# yum clean all
## 4)修改配置文件
[root@3b91f49d39d6 opt]# sed -i 's#user = apache#user = nginx#g' /etc/php-fpm.d/www.conf
[root@3b91f49d39d6 opt]# sed -i 's#group = apache#group = nginx#g' /etc/php-fpm.d/www.conf
[root@db01 ~]# cat nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
server_name _;
root /code/wordpress;
index index.php index.html;
location ~ \.php$ {
root /code/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
[root@db01 ~]# docker cp nginx.conf 3b91f49d39d6:/etc/nginx/nginx.conf
## 5)部署代码
[root@3b91f49d39d6 /]# mkdir /code
[root@db01 ~]# tar xf latest.tar.gz
[root@db01 ~]# docker cp /root/wordpress/ 3b91f49d39d6:/code/
[root@3b91f49d39d6 /]# chown nginx.nginx -R /code/
[root@3b91f49d39d6 /]# /usr/libexec/mariadb-prepare-db-dir %n
[root@3b91f49d39d6 /]# /usr/bin/mysqld_safe --basedir=/usr
[root@3b91f49d39d6 /]# mysqladmin -uroot password '123'
[root@3b91f49d39d6 /]# mysql -uroot -p123 -e "grant all on wordpress.* to wordpress@'%' identified by '123'"
## 6)制作镜像
docker commit 容器ID 镜像名:tag
docker images
#!/bin/bash
/usr/bin/mysqld_safe --basedir=/usr &
/usr/sbin/php-fpm --nodaemonize --fpm-config /etc/php-fpm.conf &
nginx -g "daemon off;"
[root@db01 ~]# docker run -it -p 80:80 -p 3306:3306 -d lnmp:wp /bin/sh /start.sh
自动制作镜像
dockerfile常用选项
FROM #基础镜像
RUN #制作镜像过程中需要的执行命令(安装服务)
CMD #容器启动的时候执行的初始命令,容易被替换(启动服务)
ENTRYPOINT #容器启动的时候执行的初始命令,不能被替换,如果同时使用CMD和ENTRYPOINT,cmd命令将作为ENTRYPOINT命令的参数
ADD #把dockerfile当前目录下的文件拷贝到容器中(自动解压tar包)
COPY #把dockerfile当前目录下的文件拷贝到容器中(不解压tar包)
WORKDIR #指定容器的默认工作目录
EXPOSE #声明镜像要暴露的端口
VOLUME #随机的持久化卷
ENV #环境变量(ssh的密码,数据库的密码)
LABEL #镜像的属性标签
MAINTAINER #管理者标识
RUN
RUN yum -y install wget
RUN wget -0 redis.tar.gz "http: / / download.redis.io/releases/redis-5.0.3.tar.gz"RUN tar -xvf redis.tar.gz
以上执行会创建3层镜像。可简化为以下格式:
FROM centos
RUN yum -y install wget l
&& wget -0 redis.tar.gz http: / / download.redis.io/releases/redis-5.0.3.tar.gz"l&& tar -xvf redis.tar.gz
如上,以、&&符号连接命令,这样执行后,只会创建1层镜像。
编写Docker file
## 目录结构
[root@db01 src]# tree -L 3 Dockerfile/
Dockerfile/
└── nginx_game
├── Dockerfile
└── h5_game
├── ceshi
├── game
├── img
├── index.html
└── readme.txt
## 编写dockerfile
[root@db01 nginx_game]# vim Dockerfile
FROM centos:7
# 删源
RUN rm -fr /etc/yum.repos.d/*
# 换源
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://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 sed -i '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
RUN sed -i '/mirrors.cloud.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
RUN yum install -y nginx
# 修改配置文件
RUN sed -i 's#/usr/share/nginx/html#/opt/h5_game#g' /etc/nginx/nginx.conf
RUN sed -ri '43a\\tindex index.html;' /etc/nginx/nginx.conf
# 拷贝网站文件
COPY h5_game /opt/h5_game
# 设置启动命令
CMD ["nginx","-g","daemon off;"]
# 暴露的端口
EXPOSE 80
## 构建镜像
[root@db01 nginx_game]# docker build -t c7_nginx:v2 .
## 查看镜像详细信息
[root@db01 nginx_game]# docker inspect c7_nginx:v2
## 启动容器
[root@db01 nginx_game]# docker run -it -p 99:80 -d c7_nginx:v2
优化Dockerfile
dockerfile 优化原则:
1:尽可能选择体积小linux发行版,alpine
2:尽可能合并RUN指令,清理无用的文件(yum缓存,源码包)
3:修改dockerfile,把变化的内容尽可能放在dockerfile结尾
4: 使用 \ 减少不必要的文件RUN 和 ADD
FROM centos:7
RUN rm -fr /etc/yum.repos.d/* \
&& curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo \
&& curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo \
&& sed -i '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo \
&& sed -i '/mirrors.cloud.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo \
&& yum install -y nginx \
&& sed -i 's#/usr/share/nginx/html#/opt/h5_game#g' /etc/nginx/nginx.conf \
&& sed -ri '43a\\tindex index.html;' /etc/nginx/nginx.conf \
&& yum clean all
COPY h5_game /opt/h5_game
CMD ["nginx","-g","daemon off;"]
EXPOSE 80
## 导出镜像
[root@db01 nginx_game]# docker save c7_nginx:v3 > c7_nginx_v3.tar.gz
[root@db01 nginx_game]# scp c7_nginx_v3.tar.gz 172.16.1.52:/root
## 导入镜像
[root@db02 ~]# docker load < c7_nginx_v3.tar.gz
[root@db02 ~]# docker run -it -p 8888:80 -d c7_nginx:v3
Docker容器化官方镜像
容器化MySQL
## 启动一个MySQL
docker run \
--name mysql57 \
-e MYSQL_ROOT_PASSWORD=123 \
-d mysql:5.7 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
## 做目录挂载
[root@db01 ~]# mkdir /data/mysql/data -p
docker run \
--name mysql57 \
-v /data/mysql/data:/var/lib/mysql \
-p 3306:3306 \
-e MYSQL_DATABASE=wordpress \
-e MYSQL_USER=wordpress \
-e MYSQL_PASSWORD=222 \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
# 做了目录挂载,容器被误删除只要目录还挂载数据将不会被丢失。但是docker里面mysql的pid和宿主机的pid会保持一致,用户名不一致。
容器化zabbix
## 容器互通(单向的) --link
[root@db01 ~]# docker run --name c7_v6 -it --link mysql57 -d centos:7 /bin/bash
# link前提是被连接的容器必须--name指定了docker名称,不然无法
解析
## zabbix
# 1.容器化一个MySQL
docker run \
--name mysql57 \
-p 3306:3306 \
-e MYSQL_DATABASE=zabbix \
-e MYSQL_USER=zabbix \
-e MYSQL_PASSWORD=zabbix \
-e MYSQL_ROOT_PASSWORD=123 \
-d mysql:5.7 \
--character-set-server=utf8 \
--collation-server=utf8_bin
# 2.容器化zabbix的后端
docker run \
--name zabbix-server-mysql \
--link mysql57 \
-p 10051:10051 \
-e DB_SERVER_HOST="mysql57" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix" \
-d zabbix/zabbix-server-mysql
# 3.容器化zabbix前端
docker run \
--name zabbix-web-nginx-mysql \
--link mysql57 \
--link zabbix-server-mysql \
-p 80:8080 \
-e DB_SERVER_HOST="mysql57" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix" \
-e ZBX_SERVER_HOST="zabbix-server-mysql" \
-e PHP_TZ="Asia/Shanghai" \
-d zabbix/zabbix-web-nginx-mysql
容器化gitlab
## gitlab
[root@db01 ~]# mkdir /data/gitlab/{config,logs,data} -p
sudo docker run -d \
--hostname gitlab.drz.com \
-p 443:443 -p 80:80 \
--name gitlab \
--restart always \
-v /data/gitlab/config:/etc/gitlab \
-v /data/gitlab/logs:/var/log/gitlab \
-v /data/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ee:latest
[root@db01 gitlab]# docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
Password: bZHJJvSHjTHvxrz328JrWhwZEr0C8FU0CDNTIcjD7Dg=
容器化es
## es
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.5.2
Comments | NOTHING