为了简化发布环境,特别是最近老是换Linux系统,搞的不同系统还得搞环境问题,为此研究怎么在Docker发布LIS系统,来实现容器化。
首先安装Docker
#更新yum仓库
yum update
#检查是否有安装docker
whereis docker
#安装需要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
#设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#查看docker版本
yum list docker-ce --showduplicates | sort -r
#安装最新的
yum install docker-ce
#查看是否成功
docker version
常用命令
启动:systemctl start docker
停止:systemctl stop docker
重启:systemctl restart docker
开机自启:systemctl enable docker
#查看所有镜像
docker images
#删除镜像
docker rmi 镜像名称
#用当前目录的Dockerfile构造镜像
docker build -t imedicallis:9.0 .
#用镜像创建容器
docker run -idt -p 5002:5002 -p 8081:8081 --name=imedicallis -v /dthealth/app/dthis/imedicallis:/dthealth/app/dthis/imedicallis imedicallis:9.0
#查看容器状态
docker ps -a
#启动容器
docker start 容器名称
#停止容器
docker stop 容器名称
#删除容器
docker rm 容器名称
#进入容器
docker exec -it imedicallis /bin/bash
#查看容器日志
docker logs 容器名称
写lis的Dockerfile
#构造imedicallis的docker镜像
#基础镜像
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
#MAINTAINER 维护者信息
MAINTAINER zhanglianzhu
#工作路径
WORKDIR /
#对外端口
EXPOSE 5002
EXPOSE 8081
#映射路径
VOLUME ["/dthealth/app/dthis/imedicallis"]
#启动容器执行的命令
ENTRYPOINT ["dotnet", "/dthealth/app/dthis/imedicallis/iMedicalLIS.dll","--urls","https://*:5002"]
构造镜像测试
[BEGIN] 2023/7/20 12:47:35
[root@localhost zlzdocker]# ls
Dockerfile
[root@localhost zlzdocker]# cat Dockerfile
#构造imedicallis的docker镜像
#基础镜像
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
#MAINTAINER 维护者信息
MAINTAINER zhanglianzhu
#工作路径
WORKDIR /
#对外端口
EXPOSE 5002
EXPOSE 8081
#映射路径
VOLUME ["/dthealth/app/dthis/imedicallis"]
#启动容器执行的命令
ENTRYPOINT ["dotnet", "/dthealth/app/dthis/imedicallis/iMedicalLIS.dll","--urls","https://*:5002"][root@localhost zlzdocker]#
[root@localhost zlzdocker]#
[root@localhost zlzdocker]#
[root@localhost zlzdocker]# docker build -t imedicallis:9.0 .
[+] Building 0.0s (0/0) docker:default
[+] Building 0.0s (0/0) docker:default
[+] Building 0.1s (0/2) docker:default
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 0.0s
=> [internal] load .dockerignore 0.1s
日志太多,删了一些 0.4s
=> => exporting layers 0.0s
=> => writing image sha256:edd4d70c03a33075c7f0103b2af6083422a5deb173df14f84ac8ba3b1f753e09 0.1s
=> => naming to docker.io/library/imedicallis:9.0 0.2s
[root@localhost zlzdocker]#
[root@localhost zlzdocker]#
[root@localhost zlzdocker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zlznginx 1.0 448f5d1d8e1a 3 hours ago 187MB
imedicallis 9.0 edd4d70c03a3 8 days ago 208MB
nginx latest 021283c8eb95 2 weeks ago 187MB
[root@localhost zlzdocker]#
[root@localhost zlzdocker]#
[root@localhost zlzdocker]# docker run -idt -p 5002:5002 -p 8081:8081 --name=imedicallis -v /dthealth/app/dthis/imedicallis:/dthealth/app/dthis/imedicallis imedicallis:9.0
7806efbc0a2516d85201a3e44405d35756812f347352698e5b30064a408f06d1
[root@localhost zlzdocker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7806efbc0a25 imedicallis:9.0 "dotnet /dthealth/ap…" 9 seconds ago Up 7 seconds 0.0.0.0:5002->5002/tcp, :::5002->5002/tcp, 0.0.0.0:8081->8081/tcp, :::8081->8081/tcp imedicallis
f87c5bb32393 nginx "/docker-entrypoint.…" 2 hours ago Exited (0) About an hour ago nginx3
6e55d8e750ca nginx "/docker-entrypoint.…" 3 hours ago Exited (0) About an hour ago nginx1
61208409f5ca nginx "/docker-entrypoint.…" 3 hours ago Exited (0) About an hour ago nginx2
[root@localhost zlzdocker]# docker logs imedicallis
warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]
Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
No XML encryptor configured. Key {e66e49d9-2b68-4d18-99f9-4aebaafb4e18} may be persisted to storage in unencrypted form.
上报信息异常:Index was outside the bounds of the array.
info: Microsoft.Hosting.Lifetime[14]
Now listening on: https://[::]:5002
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
Content root path: /dthealth/app/dthis/imedicallis/
[root@localhost zlzdocker]#
[root@localhost zlzdocker]#
[root@localhost zlzdocker]#
[root@localhost zlzdocker]# docker exec -it imedicallis /bin/bash
root@7806efbc0a25:/# ls
bin boot dev dthealth etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@7806efbc0a25:/# exit
exit
测试访问
docker exec -it 进入容器后和Linux一样,常用指令都能用,也能给他安装软件,程序需要的其他环境可以自己安装,都补完了再把镜像打包即可
[root@localhost zlzdocker]# docker exec -it imedicallis /bin/bash
root@7806efbc0a25:/#
root@7806efbc0a25:/#
root@7806efbc0a25:/#
root@7806efbc0a25:/# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
root@7806efbc0a25:/#
这里有几处需要理解:
1.首先微软的.net6镜像怎么来的?
微软用相应OS的基础镜像拉取本地后,进入容器其实就是一个干净的OS,微软把dotnet的环境给他安装上再打包镜像就成了微软给别人用的基础镜像,自己也可以选要的OS的基础镜像拉取后创建容器,自己在空白电脑安装dotnet是一样的,其他软件同理
2.我的程序在容器运行怎么改文件啊?
这里通过容器-v配置容器和宿主机的文件映射。在宿主机改对应映射的文件后容器里的文件就是修改的文件。对应好映射关系即可,对开发修改程序可以无视容器的存在(既:持久化在宿主机,容器只提供运行环境)。
3.在容器运行的程序端口怎么在外部访问?
这里用-p指定端口映射,那么对宿主映射端口的访问会转发到容器映射的端口处理。
自己给容器补全需要的环境后怎么打包成镜像给人用:
[root@localhost ~]# docker commit -a "zhanglianzhu" -m "lis9.0" imedicallis imedicallis:9.1
sha256:1494064653349464dc088637acc079497ab1d58a51bd94236f679aa5983f0508
[root@localhost ~]# docker save -o imedicallis:9.1.tar imedicallis:9.1
[root@localhost ~]# ll
总用量 206840
-rw-------. 1 root root 1230 6月 4 18:18 anaconda-ks.cfg
-rw-------. 1 root root 211798528 7月 20 13:23 imedicallis:9.1.tar
[root@localhost ~]#
[root@localhost ~]#
怎么载入自己打包的镜像
[root@localhost ~]# docker load -i imedicallis:9.1.tar
"docker load" accepts no arguments.
See 'docker load --help'.
Usage: docker load [OPTIONS]
Load an image from a tar archive or STDIN
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
imedicallis 9.1 149406465334 3 minutes ago 208MB
zlznginx 1.0 448f5d1d8e1a 4 hours ago 187MB
imedicallis 9.0 edd4d70c03a3 8 days ago 208MB
nginx latest 021283c8eb95 2 weeks ago 187MB
[root@localhost ~]#
载入之后再创建容器即可达到开包即用,看网上文档都是基于vs的开发容器发布,看的很懵的状态,完全无法理解是要给容器单独编译还是怎么的。
经过基础学习,发现开发不需要管容器化,部署的人会把自己程序做镜像即可,容器没那么神秘,进入容器里面就是一个虚拟机一样的。和正常OS一样该咋部署就咋部署。
以上就是容器化部署实验,半天的成功,为下一个版本提供容器部署用