相关教程
#docker教程
https://docker.easydoc.net/doc/81170005/cCewZWoN/lTKfePfP
#docker-python
https://zhuanlan.zhihu.com/p/137895577
docker安装
windows 下载安装 docker desktop
https://www.docker.com/products/docker-desktop/
下载安装完成之后 会提示缺少WSL 2的提示
根据提示打开链接
https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package
应该来说就可以了 ,或者重启一下就可以了
为docker安装软件
docker需要一些基础的环境,然后基于这些基础的环境进行程序的部署。
可以在Docker 官方镜像仓库查找镜像所需要的运行环境,比如centos、Redis等等(https://hub.docker.com/)
在windows powerShell 上使用 docker pull centos 命令完成安装
将自己的软件打包为镜像,并以容器形式启动
大致步骤如下
- 明确自己程序所需要的环境(java、python、程序依赖等等)
- 在docker上配置环境:第一种是直接在Dockerfile上基于最原始的环境直接配置环境。第二种是手动在最原始的环境上启动为容器并下载依赖,配好全部依赖之后存储为镜像。
- 将Dockerfile放在自己编写的程序路径处,并编写Dockerfile打包为程序镜像——指明所需要的环境依赖镜像、指明该程序镜像的启动项(启动容器的时候启动该程序)
- 打包好程序镜像之后,边可以转为容器:指明端口映射、文件映射等等。
- 运行容器
- 多容器通信
1.前置工作
在打包java程序的时候,需要在centos上安装java环境,而Centos8于2021年年底停止了服务,使用yum源安装时候,就会报错:Failed to download metadata for repo ‘AppStream’: Cannot prepare internal mirrorlist: No URLs in mirrorlist”,这时我们需要修改yum源。
而修改yum源需要将centos镜像变为容器运行,但因为Container容器中没有前台运行的进程以后,容器就会自动退出,并返回状态码为0。
所以直接将centos镜像变为容器运行就会自动退出无法修改yum源。
解决办法:容器启动时,增加一个可以长运行的服务。这个地方的前台进程可以理解为一个长服务,也就是一个一直在运行的进程。比如说Linux服务器当中的守护进程。
一般来说:使用docker run -t -d --name <命名REPOSITORY> <镜像REPOSITORY>:<镜像TAG>可以解决。
成功启动之后,就在terminal中修改yum源
cd /etc/yum.repos.d/
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
# 如果已经安装了wget就不需要这一步
yum install wget –y
# 更新yum源为阿里源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
yum clean all
yum makecache
# 验证
yum install -y vim
修改完之后需要把容器再保存为镜像,需要复制这个容器的tag
使用命令 docker commit ,将容器打包成镜像:
docker commit <容器tag> <保存为新镜像的名称>:<镜像tag>
打包为镜像之后,还可以使用 docker save 和 docker load 将镜像保存为本地文件以及读取镜像
至此已经有了一个可以正常使用yum的centos8,可以进行java程序打包为镜像的工作了
1. 编写Dockerfile
Dockerfile用于自动将自己的程序打包为镜像,并对该镜像进行一系列自动配置
建立一个文本文件,文件名必须为Dockerfile(无文件后缀)
Dockerfile文件内容如下:
#FROM指令表示使用哪个镜像作为基础进行构建。其必须是这个Dockerfile第一句有效指令。我这里使用的是centos8:latest
FROM <库内镜像名字REPOSITORY>:<库内镜像版本号TAG>
#维护者是谁
MAINTAINER <作者>
#改变镜像内环境编码为utf-8
ENV LANG C.UTF-8
#容器执行程序用户身份
USER root
#RUN指令用来在Docker的编译环境中运行指定命令。
#使用yum拉取jdk1.8环境并安装,安装后删除缓存以减少镜像大小
#在Dockerfile中配置依赖环境的好处在于,别人可以直接拿着项目文件和Dockerfile就能直接运行产生配好环境的镜像了,而不需要给人提供一个配好环境的镜像。
RUN yum install -y java-1.8.0-openjdk-devel.x86_64 && yum clean all
#ADD指令用于将本机文件复制到镜像环境中,我写的为 ADD . /app
ADD <本机文件(夹)路径> <镜像内文件(夹)路径>
#sed用于修改镜像内文件内容,具体使用方法因人而异,也可以build好容器后进入容器修改
#RUN sed -i '<文本中需要修改的内容>/c <匹配到文本需要替换的内容>' <要修改的文件的位置>
#CMD为镜像build容器后的默认启动指令,若缺少指令,可能会报错,这里的jar包路径为镜像内文件夹的路径,并且指定要具体jar和properties的文件。我写的为 /app/XXX.jar
CMD ["sh","-c","java -jar <启动jar包路径> --spring.config.location="]
2. build DockerFile
成功编写一个Dockerfile文件后,切换到Dockerfile文件所在目录,powerShell执行命令
docker build -t <库内镜像名字REPOSITORY>:<库内镜像版本号TAG> .
注意最后有一个“ .” [在.之前还有一个空格]
3. 使用镜像生成容器并启动
让生成容器命令
docker run -p <本机映射端口>:<容器内部端口> --name <命名REPOSITORY> -d <镜像REPOSITORY>:<镜像TAG>
启动的时候可以采用目录挂载的方式,便于对文件进行修改。 使用方式:用绝对路径 -v D:/code:/app
- bind mount 直接把宿主机目录映射到容器内,适合挂代码目录和配置文件。可挂到多个容器上。 使用方式:只需要一个名字 -v db-data:/app
- volume 由容器创建和管理,创建在宿主机,所以删除容器不会丢失,官方推荐,更高效,Linux 文件系统,适合存储数据库数据。可挂到多个容器上
- tmpfs mount 适合存储临时文件,存宿主机内存中。不可多容器共享。
docker run -p 8010:8010 --name 503jar -v C:\Users\aog\Desktop\503jar:/app -d 503:1
python项目建立镜像
- 下载python镜像 :
docker pull python:3.7.4
- 运行python 容器(直接进入容器的命令行模式) :
docker run -it --name pytest -v ~/PycharmProjects/pyapp:/pyapp python:3.7.4 bash
- 通过pip 下载所需要的依赖库:
#采用豆瓣源下载flask和requests
pip install flask -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
pip install requests -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
exit 命令退出docker容器
将该容器打包成镜像
在python程序路径下编写Dockerfile
FROM <上述python环境>:
WORKDIR /app
COPY . /app
CMD ["python",""]
- build
多容器通信
- 创建一个名为test-net的网络
docker network create test-net
- 项目启动时,放在同一个网络之中
docker run -p 8020:8020 --name pyapp -v ~\PyCharmProjects\pythonProject:/pyapp --network test-net -d pyapp:1
docker run -p 8010:8010 --name javaapp -v ~\503jar:/javaapp --network test-net -d 503:1
- 在python程序中用request调用java接口
#使用容器名称就能直接访问
r = requests.get('http:// javaapp:8010/bac/searchUser', params=payload)
compose
docker-compose 把项目的多个服务集合到一起,一键运行
需要编写docker-compose.yml文件
#compose 的版本号,推荐使用3.X版本。使用多个Compose配置文件扩展服务时,每个文件必须为相同的版本。
version: "3.7"
#services定义服务
services:
javaapp:
#在构建时应用的配置项。一般直接指定Dockerfile所在文件夹路径,可以是绝对路径,或者相对于Compose配置文件的路径。
#此服务的Dockerfile文件放在于compose文件的相对路径 ./503_jar 处
build: ./503_jar
#也可以使用context指定上下文路径,使用dockerfile基于上下文路径指定Dockerfile文件
#build:
#context: ./javaapp
#dockerfile: Dockerfile-alternate
ports:
- 8010:8010
volumes:
- ./503_jar:/javaapp
#设置环境变量。容器默认时间不是北京时间,增加 TZ=Asia/Shanghai 可以改为北京时间
environment:
- TZ=Asia/Shanghai
pyapp:
#此服务的Dockerfile文件放在于compose文件的相对路径 ./PyCharmProjects/pythonProject 处
build: ./PyCharmProjects/pythonProject
ports:
- 8020:8020
volumes:
- ./PyCharmProjects/pythonProject:/pyapp
environment:
- TZ=Asia/Shanghai
#volumes定义数据卷
volumes:
redis:
在compose路径处,使用powershell 运行命令启动
docker-compose up