docker使用

相关教程

#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
下载并安装

应该来说就可以了 ,或者重启一下就可以了


图片.png

为docker安装软件

docker需要一些基础的环境,然后基于这些基础的环境进行程序的部署。
可以在Docker 官方镜像仓库查找镜像所需要的运行环境,比如centos、Redis等等(https://hub.docker.com/)

找到了centos的官方镜像的安装命令

在windows powerShell 上使用 docker pull centos 命令完成安装


安装完成后在image里面就能找到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


图片.png

使用命令 docker commit ,将容器打包成镜像:

docker commit <容器tag> <保存为新镜像的名称>:<镜像tag>

打包为镜像之后,还可以使用 docker save 和 docker load 将镜像保存为本地文件以及读取镜像


可以看见已经修改yum后的centos8

至此已经有了一个可以正常使用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
我的compose放在了桌面Dsektop
会生成默认的网络desktop_default

你可能感兴趣的:(docker使用)