Docker应用部署
0. Docker如何部署应用
我们知道,容器和外部机器的网络不是互通的,不能直接通信。但是
- 外部机器和宿主机可以直接通信
- 宿主机和容器可以直接通信
因此,当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上。外部机器访问宿主机的端口,从而间接访问容器的服务。如下图所示,这种操作称为:端口映射。
下面,我们就通过端口映射来部署一些经典的应用。
1. MySQL部署
1.1 代码展示
# 1.搜索mysql镜像
[root@centos00 ~]# docker search mysql
# 2.拉取mysql镜像
[root@centos00 ~]# docker pull mysql:5.6
# 3.在/myself目录下创建mysql目录用于存储mysql数据信息(可自定义)
[root@centos00 ~]# mkdir -p /myself/mysql
[root@centos00 ~]# cd /myself/mysql
# 4.创建容器,设置端口映射、目录映射(记得一定要在刚才创建的mysql目录下)
[root@centos00 mysql]# docker run -id \
> -p 3307:3306 \ # 将容器的 3306 端口映射到宿主机的 3307 端口。
> --name=c_mysql \ # 指定容器的名字(可自定义)。
> -v $PWD/conf:/etc/mysql/conf.d \ # 配置目录:将主机当前目录下的 conf/my.cnf 挂载到容器的/etc/mysql/my.cnf。
> -v $PWD/logs:/logs \ # 日志目录:将主机当前目录下的 logs 目录挂载到容器的 /logs。
> -v $PWD/data:/var/lib/mysql \ # 数据目录:将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。
> -e MYSQL_ROOT_PASSWORD=123456 \ # 初始化 root 用户的密码。
> mysql:5.6
# 5.进入容器,操作mysql
[root@centos00 mysql]# docker exec -it c_mysql /bin/bash
[root@centos00 mysql]# mysql -uroot -p123456
[root@centos00 mysql]#show databases;
[root@centos00 mysql]#create database db1; # 创建新数据库,在里面修改数据,测试运行效果
1.2 效果截图
- 进入mysql并创建新数据库
- 使用外部机连接数据库(记得使用指定的端口3307喔)
- 在数据库db1中建表并填充数据
- 回到容器中查看数据库是否已更改(成功)(ps:我的createCRT过期了,换成XShell来操作)
1.3 过程中出现的问题:外部机无法连接,显示10060错误!!!
这个问题应该是虚拟机的配置问题,我换了个虚拟机(上面的192.168.242.5)就好了
3. Tomcat部署
3.1 代码展示
# 1.搜索tomcat镜像
[root@localhost ~]# docker search tomcat
# 2.拉取tomcat镜像
[root@localhost ~]# docker pull tomcat
# 3.在/root目录下创建tomcat目录用于存储tomcat数据信息
[root@localhost ~]# mkdir ~/tomcat
[root@localhost ~]# cd ~/tomcat
# 4.创建容器,设置端口映射、目录映射
[root@localhost tomcat]# docker run -id --name=c_tomcat \
> -p 8080:8080 \ # 将容器的8080端口映射到主机的8080端口
> -v $PWD:/usr/local/tomcat/webapps \ # 将主机中当前目录挂载到容器的webapps
> tomcat
3.2 效果截图
- 创建并运行tomcat容器(-id表示守护模式启动)
- 使用外部机器访问tomcat
注意,访问tomcat出现404表示服务已经运行成功,服务运行失败会出现下面的内容而不会出现404错误
之所以出现404是因为我们没有部署应用,服务器自然访问不到,所以我们还需要部署具体的应用才能访问 - 模拟部署应用
# 在 /root/tomcat/test 路径下创建 index.html 文件并写入内容
echo '<h1>Hello Docker Tomcat ~</h1>' > index.html
- 再次使用外部机器访问tomcat(访问路径是我们刚才定义的/root/tomcat/test)
应用部署成功!
4. Nginx部署
nginx 部署和mysql、tomcat相似,都是先拉取镜像,再通过 docker run 指令启动容器。
4.1 代码展示
# 1.搜索nginx镜像
[root@localhost ~]# docker search nginx
# 2.拉取tomcat镜像
[root@localhost ~]# docker pull nginx
# 3.在/root目录下创建nginx目录用于存储nginx数据信息
[root@localhost ~]# mkdir ~/nginx
[root@localhost ~]# cd ~/nginx
[root@localhost nginx]# mkdir conf
[root@localhost nginx]# cd conf
# 4.在~/nginx/conf/下创建nginx.conf文件,并粘贴下面内容
[root@localhost conf]# vim nginx.conf
# 直接复制整个文档即可
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
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;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
# 复制完之后wq保存退出即可
# 5.退回nginx目录,也可以直接写cd ~/nginx/
[root@localhost conf]# cd ../
# 4.创建容器,设置端口映射、目录映射
[root@localhost tomcat]# docker run -id --name=c_nginx \
-p 80:80 \ # 将容器的 80端口映射到宿主机的 80 端口。
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \ # 将主机当前目录下的 /conf/nginx.conf 挂载到容器的 :/etc/nginx/nginx.conf 配置目录。
-v $PWD/logs:/var/log/nginx \ # 将主机当前目录下的 logs 目录挂载到容器的 /var/log/nginx 日志目录。
-v $PWD/html:/usr/share/nginx/html \
nginx
- 注意:与mysql、tomcat挂载目录时相比,nginx不光挂载了日志目录 logs 、部署文件目录 html ,还挂载了nginx默认的配置文件目录,这是因为:
- nginx是用来实现反向代理、负载均衡的,经常需要改动配置文件,因此我们把nginx的配置文件一并挂载到宿主机,这样就可以方便修改
4.2 效果截图
- 编写配置文件
- 创建并运行容器
- 使用外部机器访问nginx
注意,访问nginx出现 “nginx/版本号” 表示服务已经运行成功,之所以出现403是因为我们没有部署应用(类似于tomcat的404),服务器自然访问不到,所以我们还需要部署具体的应用才能访问
- 模拟部署应用
# 在 /root/nginx/html 路径下创建 index.html 文件并写入内容
echo '<h1>Hello Docker Tomcat ~</h1>' > index.html
# 除了 echo 也可以使用 vim index.html 指令来写入
- 再次使用外部机器访问nginx(刷新页面)
应用部署成功!
5. Redis部署
5.1 代码展示
# 1.搜索redis镜像
[root@localhost ~]# docker search redis
# 2.拉取tomcat镜像,指定5.0版本
[root@localhost ~]# docker pull redis:5.0
# 3.创建容器,设置端口映射
[root@localhost ~]# docker run -id --name=c_redis -p 6379:6379 redis:5.0
# 4.使用外部机器连接redis
[root@localhost ~]# ./redis-cli.exe -h 192.168.220.12 -p 6379
keys *
set name lxs
get name
5.2 效果截图
-
创建并运行容器
-
准备外部机器运行环境(这里我用的是window下的redis)
-
使用外部机器连接redis(可以成功进入并使用redis,这里我存了一个数据:name -> cjw)
-
回到宿主机查看(可以看到数据已经保存到redis数据库中)
部署成功!