docker实践

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

安装

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

重置密码

重置gitlab登录密码

  • 进入容器命令: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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z先生09

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值