Docker 源和Dockerfile配置及常用鏡像部署

Docker安裝和常用命令請看這篇博客

Docker源

/etc/docker/daemon.jsondocker 的配置文件,默認沒有,需要我們手動創建

手動修改

vi /etc/docker/daemon.json

並填入以下內容。備註:阿里雲的地址需要獲取

{
  "registry-mirrors": [
    "https://cr.console.aliyun.com",
    "http://mirrors.tuna.tsinghua.edu.cn",
    "http://mirrors.aliyun.com",
    "http://hub-mirror.c.163.com"
  ]
}

重啓Docker

systemctl daemon-reload
systemctl restart docker

Dockerfile

語法

# 新鏡像所依賴的基礎鏡像
FROM mcr.microsoft.com/dotnet/sdk:5.0

# 表示當前容器的工作目錄 將要運行的web程序放在容器中的那個目錄下,沒有會自動創建
WORKDIR /app

# 表示會把當前目錄下的程序文件 拷貝到 容器的 /app 文件下,
COPY . .

# 設置對外暴露的端口,不設置默認爲 80
EXPOSE  80

# 利用環境變量設置ASP.NET Core應用的監聽地址,可以理解爲對外暴露端口
ENV ASPNETCORE_URLS http://*:80
# 設置時區
ENV TZ=Asia/Shanghai
# 設置中文
ENV LANG=en_US.UTF-8

# 執行Shell
RUN echo 1
 
# 執行dotnet命令啓動ASP.NET Core應用
ENTRYPOINT ["dotnet", "demo.dll"]

簡潔版

FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY . .
CMD ["dotnet", "DotnetDeploy.dll"] 

常用鏡像部署

Redis

拉取鏡像

docker pull redis:latest

--Hub地址
https://hub.docker.com/_/redis

下載配置文件

從官網獲取redis.conf配置文件,下載地址:http://download.redis.io/redis-stable/redis.conf

mkdir -p /docker/redis/{config,data}
cd  /docker/redis/config
wget http://download.redis.io/redis-stable/redis.conf

修改配置文件:

內容 備註
bind 127.0.0.1 #井號註釋掉這部分,這是限制redis只能本地訪問
protected-mode 默認yes,保護模式,限制爲本地訪問,改爲no
appendonly 默認no,redis持久化功能(no會導致重啓數據丟失),改爲yes
requirepass 設置密碼

起容器

# 簡潔版不用配置
docker run -d -p 6379:6379 --name redis  redis

# 簡潔密碼版不用配置
docker run -d -p 6379:6379 --name redis redis --requirepass 123456

# 簡潔配置(需要下載修改配置文件)
docker run -p 6379:6379 --name redis -v /root/cloud/redis/redis.conf:/etc/redis/redis.conf -v /root/cloud/redis/data:/data -d redis redis-server /etc/redis/redis.conf

# 完整版(注意配置文件路徑)
docker run -d -p 6379:6379 --name redis  --sysctl net.core.somaxconn=1024 -v /docker/redis/config/redis.conf:/etc/redis/redis.conf -v /docker/redis/data:/data -e TIME_ZONE="Asia/Shanghai" -e TZ="Asia/Shanghai"  redis redis-server /etc/redis/redis.conf

解決常見問題

警告:WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect

解決辦法:

# 在Host主機中運行,不是在Redis中
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf 
sysctl -p

警告:WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

解決辦法:

#啓動的時候帶上  --sysctl net.core.somaxconn=1024
docker run -p 6379:6379 --name redis --sysctl net.core.somaxconn=1024  -v /docker/redis/config/redis.conf:/etc/redis/redis.conf -v /docker/redis/data:/data -d redis redis-server /etc/redis/redis.conf

Ubuntu

# 鏡像地址
https://hub.docker.com/_/ubuntu/


docker pull ubuntu:22.10
docker run -itd --name ubuntu   ubuntu:22.10
docker exec -it -uroot  ubuntu  bash

Mysql

#官網
https://www.mysql.com/downloads/
# 鏡像地址
https://hub.docker.com/_/mysql
# 拉取鏡像
docker pull mysql
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456  -v /dockerdata/mysql:/var/lib/mysql  mysql   --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
# 進入容器
docker exec -it mysql  bash
#查看Mysql版本
mysql -V
# 進入Mysql
mysql -u root -p123456
use mysql
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'  WITH GRANT OPTION;
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;

# 退出
exit

# 如果開放3306端口還無法連接,就關閉防火牆
firewall-cmd --zone=public --permanent  --add-port=3306/tcp 
firewall-cmd --reload

systemctl stop firewalld 

備份

docker exec -it mysql mysqldump -uroot -p123456 test > test3.sql

Mysql-Connector-Java下載

下載地址
選擇對應的版本,然後點擊jar下載即可

MariaDB

MariaDB數據庫管理系統是MySQL的一個分支,主要由開源社區在維護,採用GPL授權許可。開發這個分支的原因之一是:甲骨文公司收購了MySQL後,有將MySQL閉源的潛在風險,因此社區採用分支的方式來避開這個風險。MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能輕鬆成爲MySQL的代替品。MariaDB 前期幾個版本基本比照 MYSQL 可以輕鬆遷移,到10以後就按照自己的思路繼續走新路,繼續社區理念去做。

#官網
https://mariadb.org/

#鏡像地址
https://hub.docker.com/_/mariadb

#拉取鏡像
docker pull mariadb

#起容器
docker run --name mariadb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /docker/mariadb/data:/var/lib/mysql -d mariadb

#進入容器
docker exec -it   mariadb   /bin/bash

#在容器內登錄數據庫
mysql -uroot -p123456

Oracle

拉取鏡像

docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

創建容器

docker run -d -p 1521:1521 --name oracle11g registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

如果Linux環境是WSL2,啓動容易可能會報Exited 139的錯誤。
處理方法:在%userprofile%目錄下創建一個.wslconfig文件,填入以下內容然後重啓容器。

[wsl2]
kernelCommandLine = vsyscall=emulate

容器配置

# 進入容器
docker exec -it oracle11g bash

# 切換root用戶,密碼:helowin
su root;

# 編輯配置文件
vi /etc/profile

# 最後一行加入以下內容後保存退出
export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
export ORACLE_SID=helowin
export PATH=$ORACLE_HOME/bin:$PATH

# 創建軟連接
ln -s $ORACLE_HOME/bin/sqlplus /usr/bin

source /etc/profile

su oracle;
sqlplus /nolog
conn /as sysdba

# 用戶名密碼
alter user system identified by 123456;
alter user sys identified by 123456;
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

# 重啓容器
docker restart oracle11g

連接DB

  • 連接類型:Basic
  • 主機:127.0.0.1
  • 端口:1521
  • 服務名/SID:helowin
  • 用戶名:system
  • 密碼:123456

Mssql

安裝

# 參考
https://aka.ms/sqlservercontainers
https://docs.microsoft.com/zh-cn/sql/linux/quickstart-install-connect-docker?view=sql-server-ver15&pivots=cs1-bash
# 鏡像地址
https://hub.docker.com/_/microsoft-mssql-server

--拉取鏡像
 docker pull mcr.microsoft.com/mssql/server:2022-latest
 docker pull mcr.microsoft.com/mssql/server:2017-latest

--起容器
--sqlserver密碼需要大小寫、數字、特殊字符這四種構成密碼纔行。
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=Mysoft@95938" -p 1433:1433 --name mssql -v /mnt:/mnt -d mcr.microsoft.com/mssql/server:2022-latest

使用MSSM鏈接時,如果通過127.0.0.1鏈接不上,可以通過IP鏈接
ubuntu查看IP參考以下命令,172.29.255.144就是IP

ip a | grep eth0 | grep inet

    inet 172.29.255.144/20 brd 172.29.255.255 scope global eth0

開啓Sql Server代理

--管理員權限進入容器
docker exec -it  -u root  mssql   /bin/bash
--容器內部運行
/opt/mssql/bin/mssql-conf set sqlagent.enabled true
exit
--重啓容器
docker restart mssql

PostgreSql

安裝

docker pull postgres
docker run -d -p 5432:5432 --name=postgresql -v /home/user/pgdata:/var/lib/postgresql/data -e POSTGRES_PASSWORD=123456 postgres

登錄名:postgres
密碼:123456

DockerUI

docker pull uifd/ui-for-docker
docker run -d -p 9000:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock uifd/ui-for-docker

Portainer

Docker可視化工具

地址

安裝

--拉取鏡像
 docker pull portainer/portainer

--起容器
docker run -d -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer

NetCore

鏡像

--鏡像地址:https://hub.docker.com/_/microsoft-dotnet-sdk

runtime:運行控制檯應用
aspnet: 運行web和控制檯應用程序
sdk:編譯和運行NetCore應用程序


--最小版(推薦使用)
docker pull mcr.microsoft.com/dotnet/sdk:6.0-alpine

--SDK
docker pull mcr.microsoft.com/dotnet/sdk:6.0

--net core run
docker pull mcr.microsoft.com/dotnet/aspnet:6.0-alpine

--5.0以下版本
docker pull mcr.microsoft.com/dotnet/core/sdk:3.1-alpine
docker pull mcr.microsoft.com/dotnet/core/aspnet:3.1-alpine

Dockerfile

vi Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY . .
CMD ["dotnet", "DotnetDeploy.dll"] 

部署

docker pull mcr.microsoft.com/dotnet/sdk:6.0-alpine
# 拷貝發佈文件和Dockerfile至目錄下
cd publish/
docker image build -t imagedemo  .
docker images
docker run -d -p  5000:80 imagedemo  

常見問題

宿主機可以訪問外網,docker容器內部無法訪問外網

全局配置DNS

less /etc/docker/daemon.json
vi /etc/docker/daemon.json

輸入以下內容保存退出重啓docker服務重新創建容器

{
 "dns": ["8.8.8.8","8.8.4.4"]
}

或者直接設置容器dns

docker run  --dns=8.8.8.8 --dns=8.8.4.4  ...

Cannot assign requested address

報錯內容:Unable to bind to http://localhost:5000 on the IPv6 loopback interface: 'Cannot assign requested address'.

原因:Dockerfile文件配置了 EXPOSE ,鏡像構建 docker run 之後 提示警告導致無法訪問但是容器內部是可以的,網絡問題,就跟本地站點是localhost,其他電腦一樣無法訪問,因爲是本地 localhost ,設置下環境變量就可以了
解決方法:docker run -e "ASPNETCORE_URLS=http://0.0.0.0:5000" -p 5000:5000 demo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章