我的服务器是CentOS7,其他环境的安装参考:Docker-菜鸟教程。
使用官方脚本自动安装。
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
启动docker
systemctl start docker
拉取镜像。hello-world是Docker官方镜像仓库Docker Hub提供的测试镜像,尝试拉取它。
docker pull hello-world
查看已有镜像。可以看到刚才拉取的hello-world镜像。
docker images
hello-world镜像非常简单,他输出一段内容。现在运行hello-world镜像。
docker run hello-world
如果输出以下内容表示运行成功。
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
...
...
For more examples and ideas, visit:
https://docs.docker.com/get-started/
镜像运行后产生容器,查看容器。
#只查看运行中的容器
docker ps
#查看所有容器
docker ps -a
注意容器的CONTAINER ID,大部分对容器的操作都要用此字段。Docker的常用指令:Docker命令大全-菜鸟教程。
接下来我们安装一些常用的中间件,我的项目中用到了mysql和redis,用他们来举例。Docker启动服务的基本步骤就是拉取镜像、运行镜像(启动容器)。
与传统概念不同,Docker中每一个服务都要单独拉取镜像,并运行在独立的容器中。而非在一个linux容器中安装所有服务,因为这样的操作方式和传统部署无异。
所以我们要分别拉取每个中间件的镜像并运行。
拉取镜像,这里用5.7版本。
docker pull mysql:5.7
运行镜像。
docker run -d --name mysql -p 13306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7 --lower_case_table_names=1
释义:
docker run:运行镜像。
-d:后台运行。
–name:为容器命名,此名称不可重复,否则运行失败。
-p 13306:3306:宿主机与容器之间的端口映射,格式为 宿主机端口:容器端口,通过访问宿主机的13306端口即可访问到容器的3306端口。Docker的配置都是宿主机在前,容器在后。这里特意用不同的端口以作区分。
-e MYSQL_ROOT_PASSWORD=root:mysql的参数,指定root用户密码,此参数为必填。
mysql:5.7:启动的镜像名称:版本。如不指定版本,则会启动latest版,如果本地镜像中没有latest版,将会自动从镜像库尝试pull。
–lower_case_table_names=1:表名忽略大小写。
用 docker ps -a 查看所有容器。如果mysql正常启动,它的状态应该是 Up xxx。
注意,即使run镜像失败,也会产生相应的容器,要启动同名的容器,必须先用 docker rm 容器id 将其移除。
可以用 docker logs 来查看容器日志。
docker logs --tail 200 -f mysql
接下来进入刚才启动的容器,修改root默认密码。
docker exec -it mysql /bin/bash
现在我们已经在容器内部(就是一个linux),可以使用容器内的mysql服务。
mysql -uroot -p
修改mysql默认密码
#切换数据库
use mysql;
#修改密码
update user set authentication_string=password('123456') where user='root';
#刷新权限
flush privileges;
拉取镜像
docker pull redis
启动镜像
docker run -d -p 16379:6379 --name redis-master redis --requirepass 123456
释义
--requirepass 123456:设置密码
官方镜像的redis映射宿主机配置文件有一些问题,本人还在研究中。
# 拉取镜像
docker pull rabbitmq:management
# 运行镜像
docker run -dit --name rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq:management
# 如果需要mqtt则拉取
docker pull cyrilix/rabbitmq-mqtt
# 然后运行
docker run -d -p 1883:1883 -p 4369:4369 -p 5671:5671 -p 5672:5672 -p 8883:8883 -p 15672:15672 -p 25672:25672 -p 15675:15675 --name rabbitmq-mqtt cyrilix/rabbitmq-mqtt
释义
-e RABBITMQ_DEFAULT_USER=admin:默认账号为admin
-e RABBITMQ_DEFAULT_PASS=admin:默认密码为admin
-p 15672:15672 -p 5672:5672:15672是后端端口,5672是前端端口
运行后访问服务器的5672端口,如图,可以用账号密码登录了。
jar包部署的原理是将jar包制作成为一个镜像,然后将其运行。就像运行一个mysql镜像一样。
Dockerfile就是制作镜像的配置文件。先把需要部署的jar包上传到服务器,在jar包相同的目录创建一个名为Dockerfile的文件。
#编辑文件,如没有则会创建
vi Dockerfile
文件内容如下。
FROM java:8
MAINTAINER tom
ADD demo-0.0.1.jar demo.jar
EXPOSE 8081
ENTRYPOINT ["java","-jar","demo.jar"]
释义:
FROM java:8:制作的镜像继承自java:8这个镜像。
MAINTAINER tom:作者是tom。
ADD demo-0.0.1.jar demo.jar:将宿主机的 demo-0.0.1.jar 文件添加到镜像中,并命名为 demo.jar。
EXPOSE 8081:容器的端口为8081,也就是该服务的端口。
ENTRYPOINT [“java”,"-jar",“demo.jar”]:容器启动之后执行的命令,也就是启动该服务。
Dockerfile准备好就可以制作镜像了,指令如下:
docker build -t myimage/demo:1 .
释义:
myimage/demo:1:分组/镜像名:版本号。
最后的点表示Dockerfile在当前目录。
制作镜像完成后,docker images可以看到我们制作完成的镜像,就可以像运行其他镜像一样将其运行起来。
#运行镜像
docker run -d --name demo -p 8081:8081 myimage/demo:1
#查看容器列表
docker ps -a
#查看容器日志
docker logs --tail 300 -f demo
后端build镜像也可以用idea的Docker插件,本文不详细说。
将前端文件加上传后并解压。比如我的前端压缩包是:dist.zip
unzip dist.zip
然后在同级目录创建Dockerfile和nginx.conf。
vi Dockerfile
vi nginx.conf
Dockerfile内容如下:
# 继承自nginx的alpine版本镜像,该版本体积较小
FROM nginx:alpine
# 添加配置文件到镜像
ADD nginx.conf /etc/nginx/nginx.conf
# 添加前端程序包到镜像
ADD dist/ /usr/docker/nginx/dist/
nginx.conf内容如下:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;
events {
use epoll;
worker_connections 65535;
}
http {
include 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;
#charset gb2312;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m;
server {
root /usr/docker/nginx/dist;#项目路径
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
# 解决web单页面开发模式 nginx代理后刷新显示404
location / {
index index.html;
try_files $uri $uri/ /index.html;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$ {
expires 30d;
# access_log off;
}
location ~ .*\.(js|css)?$ {
expires 15d;
# access_log off;
}
access_log off;
}
}
之后就是制作镜像并运行了。
# 制作前端镜像
docker build -t dist:1 .
docker run -d -p 80:80 --name dist dist:1
现在就可以访问前端啦。