如何使用Docker快速搭建服務器環(huán)境
簡介
這篇文章也是方便自己記錄搭建流程,服務器的購買啥的就不說了,最終目標就是在一個空白的Linux系統(tǒng)上,使用docker運行MySQL、Tomcat+Java、Nginx、Redis 的單機環(huán)境,以后方便自己快速的部署服務器。
安裝Docker
首先需要安裝Docker,建議按照官方的文檔(https://docs.docker.com/engine/install/centos/)
將yum鏡像源改為阿里云鏡像源,不然會從國外下載
# 安裝wget yum install -y wget # 備份原來的源配置文件 cd /etc/yum.repos.d/ mv CentOS-Base.repo CentOS-Base.repo.back # 拉取阿里云的配置文件(6可以替換成自己的CentOS版本) wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 重新加載yum yum clean all yum makecache
更新下我們系統(tǒng)的yum工具
yum update
更新完以后,按照docker官網(wǎng),先安裝yum-utils工具
yum install -y yum-utils
添加阿里云的docker鏡像源(上面改的是基礎鏡像源,非這里的docker)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安裝docker機器
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
啟動docker服務
systemctl start docker
一些常用的docker命令
############################### 鏡像命令 ##################################### # 查看docker的所有鏡像 docker images # 刪除鏡像 docker rmi 鏡像id docker rmi 鏡像名稱:版本號 # 搜索鏡像 docker search 鏡像名稱(例如:mysql,centos,nginx) # 從docker hub上拉取鏡像 docker pull mysql:版本號 docker pull mysql(默認是最新版本號) ############################### 容器命令 ##################################### # 查看當前正在運行的容器 docker ps # 查看所有的容器 docker ps -a # docker鏡像運行為容器 # -it是創(chuàng)建的交互式:創(chuàng)建完成之后直接進度終端 # -id是創(chuàng)建守護式:創(chuàng)建完成之后不進入容器 # -it創(chuàng)建的容器exit,后臺不會繼續(xù)運行 # -id創(chuàng)建的容器exit,后臺繼續(xù)運行 # -p把容器內(nèi)的3306端口映射到容器外的3355端口 docker run -it -p 3355:3306 --name mytomcat tomcat:9.0 /bin/bash # 以/bin/bash命令進入容器 docker exec -it mytomcat /bin/bash # 啟動容器() docker start -i [容器id] # 停止容器 docker stop [容器id] # 刪除容器 docker rm mytomcat # 刪除所有容器(-a 列出所有容器 -q 只取id,然后使用$符號將這些id傳入) docker rm $(docker ps -aq) # 拷貝本地文件到docker容器中 docker cp test.txt 容器id:/app/test.txt ############################### 數(shù)據(jù)卷命令 ##################################### # -v 掛載容器內(nèi)目錄/root/data_container到容器外目錄/root/data docker run -it --name=mycentos -v /root/data:/root/data_container centos:latest /bin/bash # 繼承上面的mycentos容器的數(shù)據(jù)卷 docker run -it --name=centos2 --volumes-from mycentos centos:latest ############################### 打包鏡像命令 ##################################### # 容器打包成為鏡像 docker commit [容器id] [自定義鏡像名稱]:[自定義版本號] # dockerFile轉(zhuǎn)成鏡像 docker build -f [DockerFile路徑] -t [容器名]:[TAG] .
安裝前準備
在宿主機的/home 目錄準備我們nginx、redis、mysql、tomcat的映射目錄,方便我們直接在宿主機修改配置和查看日志。
cd /home mkdir nginx mkdir tomcat mkdir redis mkdir mysql
Docker部署Nginx
# 拉取nginx最新鏡像 docker pull nginx:latest # 運行鏡像 # -d 后臺運行 (-i 以交互式方式運行,-t exit后自動結(jié)束容器) # --name 指定容器名字 # -p 映射 容器外端口:容器內(nèi)端口 (這里將宿主機的8080端口映射容器內(nèi)的80端口) # -v 映射 容器外路徑:容器內(nèi)路徑 (這里掛載nginx的配置文件、日志文件到宿主機的/home/nginx下) docker run -p 80:80 -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/logs/:/var/log/nginx/ -d nginx
運行以上命令后,使用docker ps命令發(fā)現(xiàn) nginx 容器并沒有啟動起來,原因是因為我們掛載了ngxin.conf,掛載會首先使用容器外的目錄,覆蓋容器內(nèi)的目錄,這就導致我們的nginx配置文件被清空了,于是ngxin并沒有正常啟動。官方給的做法如下:
大概意思是說,先以不掛載的形式運行docker容器,然后再把容器內(nèi)的ngxin.conf拷貝出來,接著以掛載這個拷貝的conf文件的形式啟動新的docker容器。于是容器外目錄覆蓋容器內(nèi)目錄時,就會有nginx.conf配置文件了。
一般我們都會修改我們的nginx配置文件,因為每個服務器配置的端口啥的都不一樣,安裝的應用也不一樣,所以,我們直接把自己的nginx.conf文件放到宿主機要掛載的目錄下就行了,也就是 /home/nginx/nginx.conf
一個簡單的nginx.conf樣式(包含了h5應用、管理端應用、api調(diào)用、swagger、文件存儲):
user root; worker_processes 1; events { # 連接數(shù) worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server_tokens off; access_log on; # http的匹配規(guī)則 server { listen 80; # 域名 server_name www.xxx.com; error_log logs/error.log; access_log logs/access.log; charset utf-8; location /dev { # www.xxx.com/dev,會去服務器的這個路徑/www/server/dev/h5/下找資源 root /www/server/dev/h5/; # 匹配規(guī)則,如 www.xxx.com/h5/image.jpg 會優(yōu)先找/www/server/dev/h5/image.jpg,找不到再找/www/server/dev/h5/index.html try_files $uri $uri/ /index.html; # 訪問域名時,默認訪問index.html,如 www.xxx.com/dev 會去找 /www/server/dev/h5/index.html index index.html index.htm; } location /dev/admin { root /www/server/dev/admin/; try_files $uri $uri/ /index.html; index index.html index.htm; } location /dev/swagger/ { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://localhost:8081/swagger-ui.html; } location /dev/api/ { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://localhost:8081/; } # 開放一個文件存儲目錄 location /files/ { root /www/server/; } } # https的匹配規(guī)則 #server #{ # listen 443 ssl; # # 域名 # server_name www.xxx.com; # # error_log logs/error.log; # access_log logs/access.log; # # charset utf-8; # # ssl_certificate ../cert/xxx.pem; # ssl_certificate_key ../cert/xxx.key; # # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_protocols TLSv1.2; # ssl_prefer_server_ciphers on; # ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; # # location /dev { # root /www/server/dev/h5/; # try_files $uri $uri/ /index.html; # index index.html index.htm; # } # # location /dev/admin { # root /www/server/dev/admin/; # try_files $uri $uri/ /index.html; # index index.html index.htm; # } # # location /dev/swagger/ { # proxy_set_header Host $http_host; # proxy_set_header X-Real-IP $remote_addr; # proxy_set_header REMOTE-HOST $remote_addr; # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # proxy_pass http://localhost:8081/swagger-ui.html; # } # # location /dev/api/ { # proxy_set_header Host $http_host; # proxy_set_header X-Real-IP $remote_addr; # proxy_set_header REMOTE-HOST $remote_addr; # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # proxy_pass http://localhost:8081/; # } # # location /files/ { # root /www/server/; # } #} }
添加完nginx.conf后,我們還是以掛載卷命令運行nginx容器:
# 運行鏡像 # -d 后臺運行 (-i 以交互式方式運行,-t exit后自動結(jié)束容器) # --name 指定容器名字 # -p 映射 容器外端口:容器內(nèi)端口 (這里將宿主機的8080端口映射容器內(nèi)的80端口) # -v 映射 容器外路徑:容器內(nèi)路徑 (這里掛載nginx的配置文件、日志文件到宿主機的/home/nginx下) docker run -p 80:80 -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/logs/:/var/log/nginx/ -d nginx
docker ps 發(fā)現(xiàn)后臺運行成功
Docker部署Tomcat
docker pull tomcat # 端口映射:容器外8080 --> 容器內(nèi)8080 # 配置文件映射:容器外/home/tomcat/conf --> 容器內(nèi)/usr/local/tomcat/conf # 日志文件映射:容器外/home/tomcat/logs --> 容器內(nèi)/usr/local/tomcat/logs # 部署應用目錄映射:容器外/home/tomcat/webapps/ --> 容器內(nèi)/usr/local/tomcat/webapps/ docker run -p 8080:8080 -d -v /home/tomcat/logs:/usr/local/tomcat/logs -v /home/tomcat/webapps/:/usr/local/tomcat/webapps/ tomcat
Docker部署redis
docker pull redis:latest # -p 端口映射 容器外6379 --> 容器內(nèi)6379 # -v redis配置文件映射 容器外 /home/redis/redis.conf --> 容器內(nèi) /usr/local/redis.conf # -v redis數(shù)據(jù)映射 容器外 /home/redis/data --> 容器內(nèi) /data # -d 后臺運行 # --requirepass (密碼123456) docker run -p 6379:6379 -v /home/redis/data:/data -d --requirepass 123456 redis
進入容器修改密碼
docker ps -a docker exec -it 容器ID /bin/bash cd /usr/local/bin redis-cli # 驗證密碼 auth 123456 # 修改密碼 config set requirepass ****
注意這種方式啟動的redis是沒有配置文件的,如果需要使用自定義的配置文件啟動,可以把配置文件放到 /home/redis/redis.conf 下,使用 -v 掛載到容器內(nèi)的 /usr/local/redis.conf 下,然后使用配置文件啟動redis容器
docker run -p 6379:6379 -v /home/redis/redis.conf:/usr/local/redis.conf -v /home/redis/data:/data -d redis /usr/local/redis.conf
redis配置文件下載地址:
https://github.com/redis/redis/blob/7.2/redis.conf
bind 127.0.0.1 #注釋掉這部分,使redis可以外部訪問 daemonize no #用守護線程的方式啟動 requirepass 你的密碼 #給redis設置密碼 appendonly yes #redis持久化 默認是no tcp-keepalive 300 #防止出現(xiàn)遠程主機強迫關閉了一個現(xiàn)有的連接的錯誤 默認是300
Docker部署mysql
mysql版本選擇可以到 https://hub.docker.com/_/mysql?tab=tags 這里看有那些標簽
我們安裝5.7版本
# 一句話就搞定了mysql的配置,沒有用docker得要配置倉庫源,編譯等等的,還有各種網(wǎng)絡問題,docker真強大 docker pull mysql:5.7 # -p 端口映射 容器外3306 --> 容器內(nèi)3306 # -v mysql配置文件映射 容器外 /home/mysql/conf --> 容器內(nèi) /etc/mysql/conf.d # -v mysql數(shù)據(jù)映射 容器外 /home/mysql/data --> 容器內(nèi) /var/lib/mysql (沒有映射到外面會導致數(shù)據(jù)丟失,容器刪了就沒了) # -d 后臺運行 # -e MYSQL_ROOT_PASSWORD=123456 配置mysql密碼 docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
同樣道理,配置文件需要我們自己下載放到宿主機掛載目錄下
總結(jié)
上面用到的部署命令如下,我們也可以用docker compose去編排這幾個命令,這樣就不用每次都一遍一遍運行了
# 部署mysql docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 # 部署redis docker run -d -p 6379:6379 -v /home/redis/redis.conf:/usr/local/redis.conf -v /home/redis/data:/data redis /usr/local/redis.conf # 部署tomcat docker run -d -p 8080:8080 -v /home/tomcat/logs:/usr/local/tomcat/logs -v /home/tomcat/webapps/:/usr/local/tomcat/webapps/ tomcat # 部署nginx docker run -d -p 80:80 -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/logs/:/var/log/nginx/ nginx
到此這篇關于使用Docker快速搭建服務器環(huán)境的文章就介紹到這了,更多相關Docker搭建服務器環(huán)境內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
超詳細Docker Desktop下安裝rocketmq的教程
這篇文章主要介紹了Docker Desktop下安裝rocketmq,本文內(nèi)容通過圖文操作命令給大家講解的非常詳細,需要的朋友可以參考下2021-10-10