雲服務器部署 JavaWeb 環境(基於 docker)

1 切換鏡像數據源

前往阿里雲開通容器鏡像服務,進入控制檯後進入鏡像加速器,按照流程操作即可。操作文檔摘錄如下,有刪減:

1.1 Ubuntu/CentOS

(1)安裝/升級 Docker 客戶端

推薦安裝 1.10.0 以上版本的 Docker 客戶端。

(2)配置鏡像加速器

Docker 客戶端版本大於 1.10.0 的用戶,可以通過新建或修改 daemon 配置文件 /etc/docker/daemon.json 來使用加速器。添加以下內容:

{
  "registry-mirrors": ["https://58rf2fw7wp0u.mirror.aliyuncs.com"]
}

注意:以上地址僅供參考,應依據實際賬戶提供的爲準

(3)重啓服務

systemctl daemon-reload
systemctl restart docker

1.2 Mac/Windows

登錄阿里雲後,詳見:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

2 JDK 容器

(1)在 https://hub.docker.com/_/amazoncorretto?tab=tags 下載鏡像

docker pull amazoncorretto:11.0.6

(2)Dockerfile 內容如下:

FROM amazoncorretto:11.0.6
MAINTAINER clxering <[email protected]>
# 將jar包添加到容器中的目錄
ADD demo.jar /usr/src/
# 運行jar包
ENTRYPOINT ["java","-jar","/usr/src/demo.jar"]

(3)上傳 jar 到 Dockerfile 所在目錄,假設爲 /usr/src/tmp

(4)製作鏡像,參數 -t 表示不需要緩存;指定鏡像名稱爲 springbootapp

docker build -t springbootapp:test .

注:末尾有一個點號

以下爲成功生成鏡像的提示信息:

Sending build context to Docker daemon  24.18MB
Step 1/4 : FROM amazoncorretto:11.0.6
 ---> 2acf862bb8fb
Step 2/4 : MAINTAINER clxering <[email protected]>
 ---> Running in 166531df6339
Removing intermediate container 166531df6339
 ---> a299bd5fb85a
Step 3/4 : ADD demo.jar /usr/src/
 ---> bcddaeffe8ce
Step 4/4 : ENTRYPOINT ["java","-jar","/usr/src/demo.jar"]
 ---> Running in 95f3f84fda5e
Removing intermediate container 95f3f84fda5e
 ---> dcf0f6acf7d8
Successfully built dcf0f6acf7d8
Successfully tagged springbootapp:latest

(5)啓動鏡像並連接到 MySQL

在 application.yml 配置的連接相關內容如下:

spring:
  profiles:
    active: product
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://mysqlroot:3306/databasename?
    username: xxxx
    password: xxxx

則啓動容器命令如下:

docker run -d -p 7077:7077 --link <MySQL容器別名>:mysqlroot springbootapp:test

3 MySQL 容器案例

3.1 常規配置步驟

3.1.1 獲取鏡像

https://hub.docker.com/_/mysql?tab=tags 下載鏡像

docker pull mysql:8.0.19

3.1.2 掛載配置文件 my.cnf

配置文件的掛載僅爲了便於修改,非必須步驟。

(1)爲獲取掛載路徑,建立一個測試容器

docker run --name testmysql \
-p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:8.0.19

注:用宿主 3307 端口做測試容器的映射

(2)進入測試容器

docker exec -it testmysql bash

(3)在測試容器中查找配置文件位置。可用 cat 命令依次查看給出的路徑是否存在配置文件,最後發現正確路徑爲 /etc/mysql/my.cnf

root@f088aa76bc6f:/# mysql --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf

注:上述 1-3 步驟僅供參考,若有其他方式可獲知配置文件路徑,可忽略這些步驟。

(4)在宿主上創建配置文件路徑 mkdir -p /usr/src/mysql/conf

(5)複製測試容器中的配置文件到上述目錄。以後如果要改配置,在掛載路徑的配置文件上修改即可。

docker cp testmysql:/etc/mysql/my.cnf /usr/src/mysql/conf

3.1.3 掛載數據庫數據

容器在關閉或重啓後會清空數據,宜用掛載的方式啓動 MySQL,保存數據庫數據。

(1)查找數據路徑。在測試容器執行 docker inspect testmysql,在顯示內容中找到 Mount 屬性,其中的 Destination 值即爲路徑

...
"Mounts": [
    {
        "Type": "volume",
        "Name": "20b889c7bf0ee13f654f588e158a840b3feeedac0f35f0d1fca47b4c4617809e",
        "Source": "/var/lib/docker/volumes/20b889c7bf0ee13f654f588e158a840b3feeedac0f35f0d1fca47b4c4617809e/_data",
        "Destination": "/var/lib/mysql",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],
...

(2)在宿主上創建數據件路徑 mkdir -p /usr/src/mysql/data

注:若刪除舊容器,新建容器時要清空原掛載數據目錄,除非更換路徑,否則新建的容器將無法啓動。

(3)啓動正式容器並掛載配置文件和數據

docker run --name mysqlroot \
-p 3306:3306 -e MYSQL_ROOT_PASSWORD=root \
--restart=always \
--mount type=bind,src=/usr/src/mysql/conf/my.cnf,dst=/etc/mysql/my.cnf \
--mount type=bind,src=/usr/src/mysql/data,dst=/var/lib/mysql \
-d mysql:8.0.19

參數釋義:

  • --name,給容器取一個別名爲 mysqlroot
  • -p,映射端口號,將 mysql 的端口號 3306 映射爲 3306
  • -e,MYSQL_ROOT_PASSWORD : 設置 root 密碼爲 123456
  • --mount,掛載文件或目錄
  • -d,後臺運行容器,並返回容器 ID
  • mysql:8.0.19,鏡像名稱
  • --restart=always,重新啓動 docker 後,帶該參數的容器將自行啓動

注:如果 --restart=always 參數位置放在最後,會報錯:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"--restart=always\": executable file not found in $PATH": unknown.

附加內容:爲已經創建的容器添加 --restart=always 參數

docker container update --restart=always <容器ID>

附加內容:重啓服務器後執行 docker 命令時報錯:Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?,此時重啓 daemon 及 docker 即可,執行如下命令:

systemctl daemon-reload
service docker restart

執行 service docker status 查看狀態,輸出信息有 Active: active (running) 提示則說明成功重啓

3.2 Docker 創建運行多個 mysql 容器

假設 3306 端口已經運行一個容器,現在使用宿主機的 3307 端口新開一個容器。執行如下命令:

docker run --name newone \
-p 3307:3306 -e MYSQL_ROOT_PASSWORD=root \
--restart=always \
-d mysql:8.0.19

3.3 docker 容器訪問宿主機的 MySQL

使用 ifconfig 命令可以看到,有一個 docker0 和 eth0,在 docker 容器中可以通過 eth0 的 IP 地址加上端口號(3306)這樣就可以連接宿主機的 MySQL。另外,nginx 可以通過 docker0 的 IP 地址加上構建容器時指定的端口號進行訪問容器。

相關文檔:https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-getting-started.html

4 Nginx 部署

4.1 獲取鏡像

https://hub.docker.com/_/nginx?tab=tags 獲取穩定版鏡像

docker pull nginx:stable

4.2 核心文件掛載

(1)建立測試容器

docker run --name nginxtest -d nginx:stable

(2)進入測試容器,根據系統實際情況 定位核心文件路徑

docker exec -it nginxtest bash

(3)定位配置文件路徑

  • /etc/nginx/nginx.conf
  • /etc/nginx/conf.d/

注:使用整個 conf.d 目錄可便於增加虛擬主機配置文件

(3)定位首頁目錄路徑

  • /usr/share/nginx/html

(4)定位日誌文件路徑

  • /var/log/nginx

(5)在宿主機新建對應目錄,並拷貝對應目錄

docker cp nginxtest:/etc/nginx/nginx.conf /usr/src/nginxdir/
docker cp nginxtest:/etc/nginx/conf.d/default.conf /usr/src/nginxdir/conf.d/
docker cp nginxtest:/usr/share/nginx/html /usr/src/nginxdir/
docker cp nginxtest:/var/log/nginx /usr/src/nginxdir/log/

4.3 啓動容器

docker run --name nginx \
-p 80:80 \
--restart=always \
--mount type=bind,src=/usr/src/nginxdir/nginx.conf,dst=/etc/nginx/nginx.conf \
--mount type=bind,src=/usr/src/nginxdir/conf.d/,dst=/etc/nginx/conf.d/ \
--mount type=bind,src=/usr/src/nginxdir/html,dst=/usr/share/nginx/html \
--mount type=bind,src=/usr/src/nginxdir/log/nginx,dst=/var/log/nginx \
-d nginx:stable

注:如果 --restart=always 參數位置放在最後,會報錯:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"--restart=always\": executable file not found in $PATH": unknown.

5 其他命令

  • 使服務自動啓動,systemctl enable docker
  • 使服務不自動啓動,systemctl disable docker
  • 檢查服務狀態(服務詳細信息),systemctl status docker
  • 檢查服務狀態(僅顯示是否 Active),systemctl is-active docker
  • 顯示所有已啓動的服務,systemctl list-units --type=service
  • 啓動服務,systemctl start docker
  • 停止服務,systemctl stop docker
  • 重啓服務,systemctl restart docker
  • 查看已下載的鏡像,docker images
  • 刪除指定容器,docker rm <容器ID>docker container rm <容器ID>
  • 顯示當前運行的容器,dock ps [-a]docker container ls [-a],添加參數 -a 則顯示所有容器,包括停止的
  • 使用指定 ID 的鏡像,以交互模式啓動一個容器,在容器內執行 /bin/bash 命令 docker run -itd <鏡像ID> /bin/bash
  • 進入容器,docker exec -it <容器 ID> bash,ID 不必全部填寫,可辨別即可。如果不指定 /bin/bash,容器運行後會自動停止
  • 查看磁盤剩餘空間信息,df -hl
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章