Docker 常用软件安装(九)
这篇文章介绍了如何使用 Docker 安装和部署常用软件 Tomcat、MySQL 和 Nginx。可以通过访问 Docker Hub 或通过命令“docker search”来查找镜像,然后拉取和查看镜像。使用相应命令之后,可以运行容器并访问其首页来验证容器是否运行正常。其中,Tomcat 10 版本需要修改主页目录内容,而 Tomcat 8 版本不需要。MySQL 镜像需要修改配置文件以解决中文字符乱码文件,而 Nginx 镜像启动前需要先创建外部挂载的配置文件。
摘要:本文介绍通过 Docker 安装部署常用软件 Tomcat、mysql 和 nginx 。
Tomcat 镜像可以通过访问 docker hub 或者通过命令 docker search
来查找。
示例:通过 docker hub 查找 Tomcat 镜像。
使用命令 docker search tomcat
进行镜像搜索。
镜像拉取:
bashdocker pull tomcat
查看镜像:
bash[root@10-60-55-35 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest e76527586e57 2 days ago 454MB
运行 tomcat 命令如下:
bashdocker run -d --name mytomcat -p 8080:8080 tomcat:latest
查看 tomcat 容器运行状态:
bashdocker ps
访问 http://ip:8080 验证容器运行是否正常。
由于 Tomcat 10 版本猫主页位置内容变更,所以进入容器需要修改主页目录内容。
主页内容在
webapps.dist
中,而我们访问的路径在webapps
目录,所以需要复制
webapps.dist 目录
下的文件内容到webapps 目录
下。
bash# 进入 tomcat 容器
docker exec -it mytomcat /bin/bash
# 主页内容在 webapps.dist 中,而我们访问的路径在 webapps 目录,所以需要复制 webapps.dist 目录下的文件内容到 webapps 目录下。
# 复制
root@f96e06103310:/usr/local/tomcat# cp -r webapps.dist/* webapps/
再次访问 http://ip:8080 验证容器运行是否正常。
tomcat 8 版本无需修改主页,运行命令如下:
bashdocker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
注意,此镜像无需额外pull
,本地无此镜像,会自动pull
该镜像。
mysql 镜像可以通过访问 docker hub 来查找。
示例:通过 docker hub 查找 mysql:5.7
镜像。
镜像拉取:
bashdocker pull mysql:5.7
查看镜像:
bash[root@10-60-55-35 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 bdba757bc933 5 weeks ago 501MB
启动 Mysql 容器,并配置容器卷映射
(1) 运行 mysql 命令如下:
bashdocker run -d -p 3306:3306 \
--privileged=true \
-v /app/mysql/log:/var/log/mysql \
-v /app/mysql/data:/var/lib/mysql \
-v /app/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
--name mysql \
mysql:5.7
-privileged=true
:授予权限v /whb/mysql/log:/var/log/mysql
:日志数据卷挂载。v /whb/mysql/data:/var/lib/mysql
:数据数据卷挂载。v /whb/mysql/conf:/etc/mysql/conf.d
:配置数据卷挂载。e MYSQL_ROOT_PASSWORD=123456
:通过环境变量配置 mysql root 密码。(2) 查看 mysql 容器运行状态:
bashdocker ps
(1) my.cnf 文件修改,解决中文字符乱码文件。
在宿主机/app/mysql/conf
下新建 my.cnf
,通过容器卷同步给mysql实例,解决中文乱码问题,内容如下。
bash[client] default_character_set=utf8 [mysqld] collation_server = utf8_general_ci character_set_server = utf8
(2) 重启 mysql 容器,并查看字符编码
重启容器:
bashdocker restart mysql
查看字符编码:
bash# 进入 mysql 容器
docker exec -it mysql /bin/bash
# 登录 mysql ,密码 root
mysql -u root -p
# 查看 MySQL 字符编码
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
bash#查看数据库
mysql> SHOW DATABASES;
# 创建数据库 lxctest
mysql> create database lxctest;
Query OK, 1 row affected (0.00 sec)
# 使用数据库 lxctest
mysql> use lxctest;
Database changed
# 创建数据表 user
mysql> create table user(id int,name varchar(20));
Query OK, 0 rows affected (0.40 sec)
# 在数据表 user 中插入数据
mysql> insert into user values(1,'发烧的');
Query OK, 1 row affected (0.05 sec)
# 查询 数据表 user 中的数据
mysql> select * from user;
+------+------+
| id | name |
+------+------+
| 1 | whb |
+------+------+
1 row in set (0.00 sec)
这里我想输入中文输入不了,这会导致你想用原生sql语句插入中文数据插入不了,你复制sql语句中有中文也复制不上去。
这是因为mysql容器的字符集没有使用utf8,用了别的字符集,这里我进去容器之后用命令查看字符集是POSIX
locale
这是是查看容器使用的字符集
bash#进入 mysql 容器
docker exec -it [容器id或名字] env LANG=C.UTF-8 /bin/bash
# 登录 mysql ,密码 root
mysql -uroot -p
-e LANG="C.UTF-8"
bashdocker run -d -p 3306:3306 \
--privileged=true \
-v /app/mysql/log:/var/log/mysql \
-v /app/mysql/data:/var/lib/mysql \
-v /app/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
-e LANG="C.UTF-8" \
--name mysql \
mysql:5.7
问:删除容器,再次创建容器挂载数据卷,查看数据是否存在?
答:此处实验内容省略,数据还在。
nginx 镜像可以通过访问 docker hub 来查找。
示例:通过 docker hub 查找 nginx
镜像。
命令 | 描述 |
---|---|
docker pull nginx | 下载最新版Nginx镜像 (其实此命令就等同于 : docker pull nginx ) |
docker pull nginx | 下载指定版本的Nginx镜像 (xxx指具体版本号) |
镜像拉取:
bashdocker pull nginx
查看镜像:
bashdocker images
启动前需要先创建 nginx 外部挂载的配置文件 /etc/docker/nginx/conf/nginx.conf
,之所以要先创建 , 是因为 nginx 本身容器只存在 /etc/nginx
目录 , 本身就不创建 nginx.conf
文件,当服务器和容器都不存在 nginx.conf
文件时, 执行启动命令的时候 docker 会将 nginx.conf
作为目录创建 , 这并不是我们想要的结果 。
bash# 创建挂载目录
mkdir -p /etc/docker/nginx/conf
mkdir -p /etc/docker/nginx/log
mkdir -p /etc/docker/nginx/html
# 可以执行一行命令代替上面的三行命令
sudo mkdir -p /etc/docker/nginx/{conf,html,logs}
使用以下命令验证目录是否已成功创建:
bashls -l /etc/docker/nginx
容器中的 nginx.conf
文件和 conf.d
文件夹复制到宿主机。
bash# 生成容器
docker run --name nginxtest -d -p 80:80 nginx
# 将容器 nginx.conf 文件复制到宿主机
docker cp nginxtest:/etc/nginx/nginx.conf /etc/docker/nginx/conf/nginx.conf
# 将容器 conf.d 文件夹下内容复制到宿主机
docker cp nginxtest:/etc/nginx/conf.d /etc/docker/nginx/conf/conf.d
# 将容器中的 html 文件夹复制到宿主机
docker cp nginxtest:/usr/share/nginx/html /etc/docker/nginx
查看复制到本地的配置文件
bash# 在服务器安装 tree
[root@10-60-55-35 ~]# sudo yum install tree
#查看/etc/docker/nginx 下的文件结构
[root@10-60-55-35 ~]# tree /etc/docker/nginx
/etc/docker/nginx
├── conf
│ ├── conf.d
│ │ └── default.conf
│ └── nginx.conf
├── html
│ ├── 50x.html
│ └── index.html
└── logs
删除运行的容器
bashdocker rm -f nginxtest
nginx容器运行命令:
bashdocker run \
-p 80:80 \
--name nginxtest \
-v /etc/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /etc/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /etc/docker/nginx/logs:/var/log/nginx \
-v /etc/docker/nginx/html:/usr/share/nginx/html \
--privileged=true \
-d nginx:latest
参数说明:
参数 | 说明 |
---|---|
-p 80:80 | 将容器的 80(后面那个) 端口映射到主机的 80(前面那个) 端口 |
–name nginxtest | 启动容器的名字 |
-v /etc/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf | 挂载nginx.conf配置文件 |
-v /etc/docker/nginx/conf/conf.d:/etc/nginx/conf.d \ | 挂载nginx配置文件 |
-v /etc/docker/nginx/logs:/var/log/nginx \ | 挂载nginx日志文件 |
-v /etc/docker/nginx/html:/usr/share/nginx/html \ | 挂载nginx内容 |
nginx | 本地运行的版本 |
-d | 后台运行 |
查看容器运行情况:
访问 http://ip
,查看页面是否正常。如果想修改页面内容,修改本地数据卷 /etc/docker/nginx/html
重启 nginx 容器,再次访问nginx容器。
bashdocker restart nginxtest
本文作者:LiuXueChao
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!