使用Docker可以快速搭建你的开发环境,以下是我经常用到的几个常用软件。文章的最后会总结下使用docker run的套路。
默认的,Docker会从官方的 Docker Hub 拉取镜像,国内用户想要提升访问 Docker Hub 拉取镜像的速度及稳定性,需要配置镜像站,这里使用的是DaoCloud的镜像站
以Linux系统为例:
$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
更多详情,请访问:https://www.daocloud.io/mirror
MySQL
1. Docker运行MySQL容器
$ docker run -d -p 3306:3306 --name mysql-5.7.5 \
-v /opt/docker/mysql/data:/var/lib/mysql \
-v /opt/docker/mysql/conf:/etc/mysql/conf.d \
-v /opt/docker/mysql/logs:/logs \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
-e MYSQL_ROOT_PASSWORD=yourpassword \
daocloud.io/library/mysql:5.7.5
其中,
- -v:宿主机和容器的目录映射关系;
- ":"前为宿主机目录,之后为容器目录;
- 这里分别将MySQL的数据、配置和日志目录挂载到了宿主机。
2. 修改配置
MySQL的配置文件my.cnf
会读取容器内目录/etc/mysql/conf.d下的配置文件
# 新建配置文件
$ vim /opt/docker/mysql/conf/docker.cnf
docker.cnf文件如下:
[mysqld]
skip-host-cache
skip-name-resolve
lower_case_table_names=1
character-set-server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
其中lower_case_table_names=1
表示:表名存储在磁盘是小写的,但是比较的时候是不区分大小写
重启MySQL容器,使配置生效
$ docker restart mysql-5.7.5
Redis
Redis 是一个开源,基于内存的高性能 key-value 数据库。
1. Docker运行Redis容器
$ docker run -d -p 6379:6379 --name redis-6379 \
-v /opt/docker/redis/data:/data \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
daocloud.io/library/redis:5.0 \
redis-server --appendonly yes --requirepass yourpassword
这里使用了Redis AOF持久化,同时将appendonly.aof
文件挂载到了/opt/docker/redis/data
目录下。
2. 重写aof文件
当用的时间长了,文件appendonly.aof
会越来越大,使用BGREWRITEAOF
命令可以对redis的AOF进行重写
# 伪终端以交互式的方式进入容器
$ docker exec -it redis-6379 bash
root@1ff606aa6ad6:/data# redis-cli
127.0.0.1:6379> auth yourpassword
OK
127.0.0.1:6379> BGREWRITEAOF
Background append only file rewriting started
Nginx
Nginx 是一款轻量级的 Web 服务器、反向代理服务器、及电子邮件(IMAP/POP3)代理服务器。一般使用本地安装的方式安装nginx,但我比较喜欢用docker运行,真香!
1. Docker运行Nginx容器
$ docker run --name nginx-1.17.9 -d -p 80:80 \
-v /opt/docker/nginx/html:/etc/nginx/html \
-v /opt/docker/nginx/log:/var/log/nginx:rw \
-v /opt/docker/nginx/config/conf.d:/etc/nginx/conf.d \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
daocloud.io/library/nginx:1.17.9
2. 配置
新建nginx配置文件
$ vim /opt/docker/nginx/config/conf.d/dudiao.conf
dudiao.conf
文件如下:
server {
# nginx服务器端口号
listen 80;
server_name 192.168.199.210;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
重启nginx,使配置生效
# 重启nginx
$ docker restart nginx-1.17.9
$ cd /opt/docker/nginx/html
$ touch index.html && echo 'hello world!' >> index.html
访问ip:80
即可看到刚刚输入的 hello world!
RabbitMQ
RabbitMQ 是开源的消息队列系统(或称消息中间件)
Docker运行RabbitMQ容器
$ docker run -d --name rabbitmq-3.7.24 --hostname my-rabbit \
-p 5672:5672 -p 15672:15672 \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
daocloud.io/library/rabbitmq:3.7.24-management
RabbitMQ 已经有一些自带管理插件的镜像。用这些镜像创建的容器实例可以直接使用默认的 15672 端口访问,默认账号密码是guest/guest
Neuxs
Sonatype Nexus是一个Maven私服软件
# 拉取镜像,时间会有点长,642M
$ docker pull sonatype/nexus3:3.22.0
$ mkdir -p /opt/docker/nexus/data && chown -R 200 /opt/docker/nexus/data
# 这里运行nexus3的时区还有点问题(会相差8个多小时)
$ docker run -d -p 8081:8081 --name nexus-3.22.0 \
-v /opt/docker/nexus/data:/nexus-data \
sonatype/nexus3:3.22.0
# 查看日志
$ docker logs -f nexus-8081
...
-------------------------------------------------
Started Sonatype Nexus OSS 3.22.0-02
-------------------------------------------------
访问ip:8081
,点击右上角 Sign in 按钮,进行登录,账号为:admin,密码在 /opt/docker/nexus/data/admin.password中。
关于Nexus3的使用,有机会开一章单独说下。
Gitlab
Gitlab是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。官方推荐需要至少4G的内存。
1. Docker运行Gitlab容器
# 时间会比较久,共1.89GB
$ docker pull gitlab/gitlab-ce:12.8.8-ce.0
$ docker run --detach \
--publish 10443:443 --publish 10080:80 --publish 10022:22 \
--name gitlab-ce-12.8.8-ce.0 \
--volume /opt/docker/gitlab/config:/etc/gitlab \
--volume /opt/docker/gitlab/logs:/var/log/gitlab \
--volume /opt/docker/gitlab/data:/var/opt/gitlab \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
gitlab/gitlab-ce:12.8.8-ce.0
# 查看日志,启动需要几分钟
$ docker logs -f gitlab-ce-12.8.8-ce.0
耐心等待一段时间后,访问ip:10080/gitlab
可以测试是否启动成功。
出现该页面时,则启动成功,先别着急填写密码,咱们需要做一些配置。
2. 修改配置文件
配置文件路径为:
/opt/docker/gitlab/config/gitlab.rb
- 修改邮箱配置(可选)
### Email Settings
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "[email protected]"
gitlab_rails['smtp_password'] = "your_smtp_password"
gitlab_rails['smtp_domain'] = "exmail.qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
# If your SMTP server does not like the default 'From: gitlab@localhost' you
# can change the 'From' with this setting.
gitlab_rails['gitlab_email_from'] = '[email protected]'
gitlab_rails['gitlab_email_reply_to'] = '[email protected]'
- 修改external_url(可选)
如果你想用域名访问gitlab服务,可以更改external_url的值
## GitLab URL
##! URL on which GitLab will be reachable.
##! For more details on configuring external_url see:
##! https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab
external_url 'http://gits.xyz'
- 修改ssh端口
### GitLab Shell settings for GitLab
gitlab_rails['gitlab_shell_ssh_port'] = 10022
3. 刷新配置
使用docker restart
这样的方式来重启容器达到配置生效的效果,这样做非常不安全,配置文件可能只有部分生效而且很可能造成gitlab的完全崩溃,无法启动。
使用gitlab-ctl reconfigure
命令刷新配置
$ docker exec -it gitlab-ce-12.8.8-ce.0 /bin/bash
root@0d8135776b45:/# gitlab-ctl reconfigure
# 出现如下界面,则重载配置成功
gitlab Reconfigured!
root@0d8135776b45:/# exit
然后重启docker就可以了
$ docker restart gitlab-ce-12.8.8-ce.0
4. 测试
- 测试邮箱(可选)
$ docker exec -it gitlab-ce-12.8.8-ce.0 /bin/bash
root@0d8135776b45:/# gitlab-rails console
--------------------------------------------------------------------------------
GitLab: 12.8.8 (6ea04b16a40) FOSS
GitLab Shell: 11.0.0
PostgreSQL: 10.12
--------------------------------------------------------------------------------
Loading production environment (Rails 6.0.2)
irb(main):001:0> Notify.test_email('[email protected]', '测试邮件标题', '测试邮件正文').deliver_now
收到邮件,Get!
- 初次登陆时,需要访问
ip:10080
修改root密码
然后创建个项目试试
可以看到咱之前设置的external_url和ssh端口已经生效,Get!
总结
每个镜像如何使用,一般可以在https://hub.docker.com/
会有详细的描述。比如MySQL
官方会给出详细介绍
当你使用docker镜像遇到困惑时,可以试着查看这些文档。
下面总结下上面运行的几个镜像的关键点:
- 暴露端口:
-p
- 挂载文件(数据、配置、日志):
-v
- 设置参数:
-e
- 修改配置文件
而这些关键点和如何构建docker镜像由有着关联,感兴趣的可以了解下docker build
命令,构建一个自己的镜像。