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

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