Docker 源和Dockerfile配置及常用镜像部署
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 . .
ENTRYPOINT ["dotnet", "DotnetDeploy.dll"]
使用变量
FROM mcr.microsoft.com/dotnet/aspnet:7.0
WORKDIR /app
COPY . .
ARG dll="Default_Value"
ENV dll=${dll}
RUN echo "${dll}"
ENTRYPOINT dotnet ${dll}.dll
Run
docker build --build-arg dll="WebApplication1" -t imagedemo4 .
常用镜像部署
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_general_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