Docker安裝和常用命令請看這篇博客
Docker源
/etc/docker/daemon.json
是 docker
的配置文件,默認沒有,需要我們手動創建
手動修改
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可視化工具
地址
- https://github.com/portainer/portainer
- https://hub.docker.com/r/portainer/portainer
- https://docs.portainer.io/
安裝
--拉取鏡像
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