Docker 环境搭建
docker 安装
-
安装参考 https://help.aliyun.com/document_detail/51853.html?spm=a2c4g.11174283.6.548.2d3b4541ehG1Ny
-
1、添加yum源。
yum install epel-release –y
yum clean all
yum list
- 2、 安装并运行Docker。
yum install docker-io –y
systemctl start docker
- 3、 检查安装结果
docker info
docker 开启远程访问
vim /etc/docker/daemon.json
{
"hosts":[
"unix:///var/run/docker.sock",
"tcp://0.0.0.0:2375"
]
}
#重新加载配置文件
systemctl daemon-reload
#重启服务
systemctl restart docker
#查看端口是否开启
netstat -nptl
#直接curl看是否生效
curl http://127.0.0.1:2375/info
telnet服务端2375端口测试
[root@client ~]# telnet 192.168.100.7 2375
telnet> quit
国内docker pull镜像加速
- 参考文章 https://developer.aliyun.com/article/745392
- 配置加速器
[root@localhost network-scripts]# vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://mj9kvemk.mirror.aliyuncs.com"]
}
- 重启docker
[root@localhost docker]# systemctl restart docker
docker 快速上手
- 参考文章 https://docs.docker.com/engine/reference/commandline/docker
常用命令
yum install docker #安装docker
systemctl start docker #启动docker
systemctl enable docker #开机启动
systemctl stop docker #关闭docker
docker search mysql #搜索命令
docker pull mysql #下载镜像
docker images #查看下载了那些镜像
docker rmi 镜像id #删除镜像
docker ps #查看运行中的容器
docker ps -a #查看所有容器
docker stop 容器id #停止运行中的容器
docker start 容器id #启动容器
docker logs 容器id #查看容器启动日志
docker rm 容器id #删除容器
docker inspect 容器id | grep IPAddress #查看容器IP信息
docker network create busServeNet #创建docker内部网络busServeNet
docker network ls #查看docker内部网络信息
docker --link 容器名称A --link 容器名称B #不建议,该方式不安全.允许B容器到A容器的单向访问
docker run –-name 容器名 镜像名 #简单启动容器(完整启动查看相关启动命令)
docker run –d –p 8888:8080 –-name xx --restart always #-d 后台运行、-p 服务器端口:容器端口 端口映射、--name 容器名称 指定容器名称、--restart always 自动重启
------------------------------------------------
-it : 目前的理解浅薄,就是要等在容器内的命令执行完毕才会出来到当前操作; 没有-it的加 就相当于在容器内执行一下命令,不等容器内部是否执行完毕直接出来,而我们看见的他在上面是因为容器内的执行快,(行动派可以试试在里面写个循环制造时间验证)
那么就出来了 -it ....bash 的组合
-it ....bash:上面说到在加上-it 会等容器内的操作执行完毕,而bash 是打开容器内的一个终端近程,又因为it的等待 所以就会一直以终端连接的方式停留在容器内部
Docker 使用前篇
容器命名推荐
- 建议采用骆驼命名法,例如groupNginxTest
- 案例一,在java微服务中,通过容器名字访问别的容器时,如:
在java微服务中,通过容器名字访问别的容器时,如:
security:
oauth2:
client:
client-id: xxxx
client-secret: xxx
resource:
jwt:
key-uri: http://group_oauth_serve:80/oauth/token_key
不能使用“_”,该符号会被转义成%5F,由于无法识别网络别名,致使访问其他容器失败
network命令详解
- 参考文章 https://www.cnblogs.com/jsonhc/p/7823286.html
- 创建一个网络名为my_net且driver为bridge的网络
docker network create my_net
- 查看local的网络信息
docker network ls
- 加入my_net网络,并通过–network-alias指定了各自的别名,groupTomcat1和groupTomcat2都在my_net网络中,它们之间可以通过别名进行互相访问。如果没指定别名,也可以通过容器名进行互相访问
docker run –d \
–p 8888:8080 \
-v /etc/localtime:/etc/localtime:ro \
--network my_net \
--network-alias groupTomcat1 \
--name groupTomcat1 tomcat
docker run –d \
–p 8888:8080 \
-v /etc/localtime:/etc/localtime:ro \
--network my_net \
--network-alias groupTomcat1 \
--name groupTomcat2 tomcat
镜像导入和导出
- 导出镜像, nginx.tar为目标文件,nginx:latest是源镜像名(name:tag)
docker save -o nginx.tar nginx:latest
- 导入镜像
docker load -i nginx.tar
与宿主机同步时间
-
参考文章 https://www.cnblogs.com/lobin/p/10581964.html
-
使用docker容器部署的应用,会出现时间与主机不一致的情况,容器时间与主机差8个小时,宿主机的与容器的/etc/localtime不一致
docker run –d \
–p 8888:8080 \
-v /etc/localtime:/etc/localtime:ro \
--name group_tomcat_1 tomcat
--------------------------说明----------------------------------
-v /etc/localtime:/etc/localtime:ro
共享宿主机时间,后面的 :ro 指定该 volume 为只读
- 如果里面运行的是java程序,哪么程序时间还是会8个小时的差别:主要是Java或取时间是从/etc/timezone里获取时区,解决方法:挂载主机的/etc/timezone,或者是通过jvm参数将时区信息传进jvm里:-Duser.timezone=GMT+08
docker run –d \
–p 8888:8080 \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
--name group_test_serve test_serve
- Dockerfile 定义环境变量指定时区,推荐这种
ENV TZ=Asia/Shanghai
容器内安装常用命令
- 参考文章 https://cloud.tencent.com/developer/article/1401076
安装apt-get,方便安装其他命令
apt-get update
安装vim
apt-get install vim
安装telnet
apt-get install telnet
安装ifconfig
apt-get install net-tools
安装ping
apt install iputils-ping
Docker 安装MongoDB示例
mongo docker run -p 27017:27017 -v /data/mongo/db --name mongoDB -d mongo --auth
创建mongo auth用户
docker exec -it mongoDB bash
mongo
mongo > use admin
mongo > db.createUser({user:'root',pwd:'root',roles:[{role:"userAdminAnyDatabase", db: "admin"}]})
mongo > exit
mongo
mongo > use admin
mongo > db.auth(‘root’, ‘root’)
创建数据库普通用户
mongo > use test
mongo > db.createUser({user:'testDB',pwd:'123456', roles:[{role:"dbOwner", db:"test"}]})
mongo > show users
远程连接工具
Robo 3T
- mongoDB角色 内建角色
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
- dbOwner 角色 注:dbOwner 代表数据库所有者角色,拥有最高该数据库最高权限。
Docker 安装Nginx示例
参考文献
-
Docker 安装 Nginx https://blog.csdn.net/QCIWYY/article/details/91045070
-
菜鸟教程-Docker 安装 Nginx https://www.runoob.com/docker/docker-install-nginx.html
下载镜像
docker pull nginx:1.17.5
目录结构
[root@centos01 nginx]# pwd
/data/nginx
[root@centos01 nginx]# tree -L 1
.
├── conf
├── logs
└── www
复制容器内默认配置文件到本地
docker cp group_nginx_1:/etc/nginx/nginx.conf /data/nginx/conf/nginx.conf
docker cp group_nginx_1:/etc/nginx/conf.d /data/nginx/conf/conf.d
目录说明:
www: 目录将映射为 nginx 容器配置的虚拟目录。
logs: 目录将映射为 nginx 容器的日志目录。
conf: 目录里的配置文件将映射为 nginx 容器的配置文件。
安装
- 快速安装
docker run -d --name group_nginx_1 -p 8088:80 nginx:1.17.5
- 完整安装
docker run -d \
-p 80:80 \
-v /data/nginx/www:/usr/share/nginx/html \
-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /data/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /data/nginx/logs:/var/log/nginx \
-v /etc/localtime:/etc/localtime:ro \
--privileged=true \
--name group_nginx_1 nginx:1.17.5
- 命令说明
-p 80:80: 将容器的 80 端口映射到主机的 80端口。
--name group_nginx_1:将容器命名为group_nginx_1。
-v /data/nginx/www:/usr/share/nginx/html:将我们自己创建的 www 目录挂载到容器的 /usr/share/nginx/html。
-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:将我们自己创建的 nginx.conf 挂载到容器的 /etc/nginx/nginx.conf。
-v /data/nginx/conf/default.conf:/etc/nginx/conf.d/default.conf:将我们自己创建的 default.conf 挂载到容器的 /etc/nginx/conf.d/default.conf。
-v /data/nginx/logs:/var/log/nginx:将我们自己创建的 logs 挂载到容器的 /var/log/nginx。
其他
-
浏览器输入:http://192.168.0.10:8088/
-
自定义nginx映射
vim ./33web.conf
upstream myGateway {
server 127.0.0.1:9010;
#server 192.168.10.121:3333 backup; #热备
}
#error_page 404 /404.html; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 80; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://myGateway; #请求转向mysvr 定义的服务器列表
#deny 127.0.0.1; #拒绝的ip
#allow 172.18.5.54; #允许的ip
}
}
Docker 安装Mysql示例
准备
docker search mysql:5.7
docker pull mysql:5.7
- 快速安装
docker run -d \
-e MYSQL_ROOT_PASSWORD=root \
--name group_mysql_1 mysql:5.7
- 复制配置文件到宿主机
mkdir /data/mysql/data
mkdir /data/mysql/logs
docker cp group_mysql_1:/etc/mysql/conf.d /data/mysql/conf
安装
docker run -d \
-p 3306:3306 \
-v /data/mysql/conf:/etc/mysql/conf.d \
-v /data/mysql/logs:/logs \
-v /data/mysql/data:/var/lib/mysql \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD=root \
--privileged=true \
--name group_mysql_1 mysql:5.7
---------------------------参数说明-----------------------------------------
-v /data/mysql/logs/slow.log:/var/lib/mysql/tmp_slow.log 设置慢查询日志存储位置
-v /etc/localtime:/etc/localtime:ro 容器内部使用主机时间
-e MYSQL_ROOT_PASSWORD=root 设置默认root用户的密码
--privileged=true 给容器加上特定权限
修改原始密码
- 登录进入mysql
[root@appplication mysql]# docker exec -it groupA_mysql_1 env LANG=C.UTF-8 /bin/bash
root@appplication:/# mysql -uroot -p
mysql> show databases;
mysql> use 数据库;
------------------------------------- 参数说明----------------------------------
容器系统使用的是POSIX字符集,POSIX字符集是不支持中文的,
而C.UTF-8是支持中文的 只要把系统中的环境 LANG 改为"C.UTF-8"格式即可解决问题
LANG=C.UTF-8 字母一定要大写
env LANG=C.UTF-8
- 修改原始密码 参考#mysql实践-修改密码
set password for root@localhost = password('root');
- 自定义配置my.cnf ,修改默认编码为utf-8
vim mysql.cnf
------------------------------------------------------
[client]
default-character-set=utf8
[mysqld]
character_set_server=utf8
slow_query_log = ON
slow_query_log_file =/logs/tmp_slow.log
long_query_time = 1
[mysql]
default-character-set=utf8
------------------------配置说明------------------------------
#作用于外部的显示
default-character-set=gbk
#作用于内部,会作用于创建库表时默认字符集
character_set_server=gbk
#开启并记录慢查询
slow_query_log = ON #开启慢查询
long_query_time = 1 #慢查询的临界值, 单位秒
slow_query_log_file =/logs/tmp_slow.log #慢查询数据保存的位置
------------------------重启mysql------------------------------
docker restart group_mysql_1
关闭远程连接
- 关闭远程连接
update mysql.user set host='172.17.0.%' where user='root' and host='%';
- 修改该用户的密码,默认是root
set password for root@'172.17.0.%' = password('新的密码');
Docker 安装Zipkin 2.18
参考文献
下载镜像
docker pull openzipkin/zipkin:2.18
#简单安装
docker run -d -p 9411:9411 openzipkin/zipkin:2.18
初始化数据库mysql
- 首先创建数据库zipkin,编码使用utf8
- 执行脚本建表https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql
安装
docker run -d \
--name groupA_zipkin_1 \
-p 9411:9411 \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_USER=root \
-e MYSQL_PASS=root \
-e MYSQL_HOST=192.168.0.10 \
-e STORAGE_TYPE=mysql \
-e MYSQL_DB=zipkin \
-e MYSQL_TCP_PORT=3306 \
--net host \
openzipkin/zipkin:2.18 \
--restart always
访问
安装后访问地址http://192.168.0.10:9411/zipkin/
Docker 安装Gitlab
参考文献
https://www.jianshu.com/p/080a962c35b6
gitlab配置外部数据库
下载镜像
docker pull gitlab/gitlab-ce:12.3.5-ce.0
安装
docker run -d \
--name group_gitlab_1 \
--privileged=true \
-p 443:443 \
-p 80:80 \
-p 222:22 \
-v /etc/localtime:/etc/localtime:ro \
-v /data/gitlab/conf:/etc/gitlab \
-v /data/gitlab/logs:/var/log/gitlab \
-v /data/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:12.3.5-ce.0 \
--restart always
gitlab配置IP
如: http://e91a46988168/root/config-server.git,将e91a46988168改为ip
vim /etc/gitlab/gitlab.rb
vim /data/gitlab/conf/gitlab.rb,修改:external_url 'http://192.168.0.10:80'
rm -rf /data/gitlab/data
重启容器:docker restart group_gitlab_1
重置密码
- 进入容器命令:docker exec -it <容器id> /bin/bash
- 执行gitlab-rails console
- user = User.where(username: ‘root’).first
- user.password = ‘password’
- user.save!
访问
最好是将80端口换成其他端口
http://192.168.0.10:80
Docker 安装OpenJdk环境
参考文献
https://www.cnblogs.com/wx170119/p/12449342.html
下载镜像
docker pull openjdk:16-jdk
安装
- 安装命令
docker run -p 7043:80/udp \
-d -it \
-v /data/java/:/jar/ \
--name groupJava openjdk:16-jdk
- 说明
将宿主机的7443与容器内80端口进行绑定
将宿主机的/data/java目录与容器内的jar目录进行绑定
简单使用
- 进入容器内部
docker exec -it groupJava /bin/bash
- 查看jdk版本
bash-4.4# java -version
openjdk version "16-ea" 2021-03-16
OpenJDK Runtime Environment (build 16-ea+13-521)
OpenJDK 64-Bit Server VM (build 16-ea+13-521, mixed mode, sharing)
- 运行自定义jar包
Docker 安装apache2环境
下载镜像
docker pull httpd:2.4.41
目录结构
[root@centos01 httpd]# pwd
/data/httpd
[root@centos01 httpd]# tree
.
├── conf
├── logs
└── www
准备
- 复制/usr/local/apache2/conf/httpd.conf到/data/httpd/conf/httpd.conf
docker run -d -p 80:80 --name group_httpd_1 httpd:2.4.41
docker cp group_httpd_1:/usr/local/apache2/conf/httpd.conf /data/httpd/conf/httpd.conf
docker rm -f group_httpd_1
安装
docker run -d \
-p 80:80 \
-v /data/httpd/www/:/usr/local/apache2/htdocs/ \
-v /data/httpd/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf \
-v /data/httpd/logs/:/usr/local/apache2/logs/ \
-v /etc/localtime:/etc/localtime:ro \
--privileged=true \
--name group_httpd_1 httpd:2.4.41
简单使用
vim /data/httpd/www/404.html
404
http://192.168.0.10/404.html
Docker 安装php-apache环境
下载镜像
docker pull webdevops/php-apache-dev:centos-7
目录结构
[root@centos01 php-apache]# pwd
/data/php-apache
[root@centos01 php-apache]# tree
.
├── conf
├── logs
└── www
准备
- 复制/etc/httpd/conf/httpd.conf到/data/php-apache/conf/httpd.conf
docker run -d -p 80:80 --name group_php_apache_1 webdevops/php-apache-dev:centos-7
docker cp group_php_apache_1:/etc/httpd/conf/httpd.conf /data/php-apache/conf/httpd.conf
docker rm -f group_php_apache_1
安装
docker run -d \
-p 80:80 \
-v /data/php-apache/www/:/app \
-v /data/php-apache/conf/httpd.conf:/etc/httpd/conf/httpd.conf \
-v /etc/localtime:/etc/localtime:ro \
--privileged=true \
--name group_php_apache_1 webdevops/php-apache-dev:centos-7
简单使用
vim /data/httpd/www/index.php
<?php phpinfo(); ?>
http://192.168.0.10/index.php
Docker 安装WireMock
- 下载镜像
docker pull rodolpheche/wiremock:2.25.1
- 安装
docker run -d \
-p 8080:8080 \
--name group_wiremock_1 rodolpheche/wiremock:2.25.1
Docker 安装WireMock-GUI
- 下载镜像
docker pull holomekc/wiremock-gui:2.25.1
- 安装
docker run -d \
-p 8080:8080 \
--name group_wiremock_1 holomekc/wiremock-gui:2.25.1
- 管理界面
#进入管理页面 ,请自行替换ip地址
http://127.0.0.1:30080/__admin/webapp
Docker 安装Zookeeper
下载镜像
docker pull zookeeper:3.5.6
目录结构
[root@centos01 zookeeper]# pwd
/data/zookeeper
[root@centos01 zookeeper]# tree
.
├── data
└── zoo.cfg
#将zoo.cfg复制到本地
docker cp group_zookeeper_1:/conf/zoo.cfg /data/zookeeper/zoo.cfg
快速安装
docker run -d \
-p 2181:2181 \
--name group_zookeeper_1 zookeeper:3.5.6
完整安装
docker run -d \
-p 2181:2181 \
-v /data/zookeeper/data/:/data/ \
-v /data/zookeeper/zoo.cfg:/conf/zoo.cfg \
-v /etc/localtime:/etc/localtime:ro \
--privileged=true \
--name group_zookeeper_1 zookeeper:3.5.6
其他
docker exec -it group_zookeeper_1 bash
##zookeeper客户端工具
zkCli.sh
Docker 安装ctrip apollo(阿波罗)
- docker 安装指导 https://hub.docker.com/r/nobodyiam/apollo-quick-start
下载镜像
docker pull nobodyiam/apollo-quick-start:latest
TODO 待实现
Docker 安装邮件服务器
- docker.io/bestwu/ewomail
docker run -d -h mail2.5taogame.com \
-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 81:80 \
-p 8088:8080 \
-v /data/mail/mysql/data/:/ewomail/mysql/data/ \
-v /data/mail/vmail/:/ewomail/mail/ \
-v /data/mail/ssl/certs/:/etc/ssl/certs/ \
-v /data/mail/ssl/private/:/etc/ssl/private/ \
-v /data/mail/rainloop/:/ewomail/www/rainloop/data \
-v /data/mail/ssl/dkim/:/ewomail/dkim/ \
--name group_ewomail_1 \
bestwu/ewomail \
--restart=always
邮箱管理后台http://localhost:8080
Rainloop 管理端 http://localhost:8088/?admin
Rainloop 用户端 http://localhost:8088
邮箱管理后台http://localhost:8080 账号 admin 密码 ewomail123
Rainloop 管理端 http://localhost:8088/?admin 账号密码在邮箱管理后台添加设置
Rainloop 用户端 http://localhost:8088 账号密码在邮箱管理后台添加设置
推送到阿里云容器镜像服务器
登录服务器: docker login --username=liuyuedeyuzss@163.com registry.cn-shenzhen.aliyuncs.com
创建镜像:docker tag 27764c8758a0 registry.cn-shenzhen.aliyuncs.com/zs_group/zs_images:zs_rabbitmq
推送到服务器:docker push registry.cn-shenzhen.aliyuncs.com/zs_group/zs_images:zs_rabbitmq
拉取镜像:docker pull registry.cn-shenzhen.aliyuncs.com/zs_group/zs_images:zs_rabbitmq
其他
linux常用命令
#查看端口占用情况
netstat -tunlp
踩坑
设置 Docker 容器时间
-
设置 Docker 容器时间与宿主机的一致
docker run –d –p 8888:8080 -v /etc/localtime:/etc/localtime:ro tomcat 创建容器,并且容器将共享主机时间,后面的 :ro 指定该 volume 为只读
privileged=true 参数
Fatal error in defaults handling. Program aborted!
Centos7安全Selinux禁止了一些安全权限,导致mysql和mariadb在进行挂载/var/lib/mysql的时候会提示以上信息
在docker run中加入 --privileged=true 给容器加上特定权限
eg:
docker run -d \
-p 3306:3306 \
-v /data/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
--privileged=true \
--name group_mysql_1 mysql:5.7