Dockfile构建项目,docker远程项目,dockercompose使用

发布时间 2023-04-17 10:26:24作者: 李阿鸡

Dockfile命令

FROM:     指定基础镜像
RUN:     构建镜像过程中需要执行的命令。可以有多条。docker build
CMD:     添加启动容器时需要执行的命令。多条只有最后一条生效。可以在启动容器时被覆盖和修改。
ENTRYPOINT:同CMD,但这个一定会被执行,不会被覆盖修改。
MLABELAINTAINER:表明镜像的作者。将被遗弃,被LABEL代替。
EXPOSE:   设置对外暴露的端口。
ENV:     设置执行命令时的环境变量,并且在构建完成后,仍然生效
ARG:     设置只在构建过程中使用的环境变量,构建完成后,将消失
ADD:     将本地文件或目录拷贝到镜像的文件系统中。能解压特定格式文件,能将URL作为要拷贝的文件,会下载里面的文件
COPY:    将本地文件或目录拷贝到镜像的文件系统中。
VOLUME:   添加数据卷
USER:    指定以哪个用户的名义执行RUN, CMD 和ENTRYPOINT等命令
WORKDIR:  设置工作目录
ONBUILD:  如果制作的镜像被另一个Dockerfile使用,将在那里被执行Docekrfile命令
STOPSIGNAL:设置容器退出时发出的关闭信号。
HEALTHCHECK:设置容器状态检查。
SHELL:    更改执行shell命令的程序。Linux的默认shell是[“/bin/sh”, “-c”],Windows的是[“cmd”, “/S”, “/C”]。

使用Dockfile构建一个django项目

  1. 有一个写好的项目,在项目路径下新建Dockerfile文件,写入
2 FROM python:3.8
MAINTAINER lxj  
WORKDIR /soft
COPY ./requirements.txt /soft/requirements.txt
RUN pip install -r requirements.txt -i https://pypi.doubanio.com/simple
CMD ["python","manage.py","runserver","0.0.0.0:8080"]

2 把代码提交到git上

3.在上线机器上clone下来

4.使用docker构建镜像

docker build -t='镜像名' .   

5 创建启动容器

docker build -t='django_books' .

6 运行容器

docker run -id --name=books -v /root/lxj/books/books:/soft -p 8080:8080 books_django:latest

开发人员继续提交代码,运维人员pull代码,重启容器,用户就可以看到最新的了
重启docker容器即可,如果有新增加的依赖,重写构建镜像,运行容器

docker远程仓库

docker官方提供了一个仓库,但是一般不会把我们的项目代码放在上面,公司一般会自己搭建一个私有仓库,上传到私有仓库里

镜像传到官方仓库

第一步,需要给我传的镜像打标签

docker tag 镜像 远程仓库的名
docker tag 镜像id liaji/centos-vim:v1  # 会产生一个新的镜像

登录到远端仓库

docker login

推(注意先删除原本的镜像)

docker push 镜像的名字 

镜像分层概念

每一个docker命令都会构建一层镜像,本质上就是每一层都会启动一个容器,执行完命令后,将容器进行提交成镜像。我们把它提交到远程仓库,如果远程仓库已有原有的那一层镜像,就不会再次传输只会传输新构建的层。
在原有的镜像已经存在需要转移镜像的目标机时,如果再次拉取镜像只会拉取新构建的那层镜像。
好处:构建快,分发方便,如果本地有这一层了,就不需要在下载了
# 查看镜像分层命令
docker history liaji/centos-vim:v1

补充

因为每run一次就会构建一层,建议合为一条
RUN python -m pip install --upgrade pip &&\
    python -m pip install --upgrade setuptools &&\
    pip install -r requirements.txt

私有仓库搭建

harbor:企业级私有仓库

教程

https://blog.csdn.net/Gf19991225/article/details/121982824

registry 用docker搭建私有仓库

  1. 拉取镜像
docker pull registry
  1. 运行容器
docker run -id --name=registry -p 5000:5000 registry
  1. 修改daemon.json
vi /etc/docker/daemon.json
{  
    "insecure-registries":["ip:5000"]
} 
  1. 重启docker
systemctl restart docker
docker start registry
  1. 打开浏览器访问
http://10.0.0.200:5000/v2/_catalog
看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空
  1. 把某个镜像tag成私有仓库的镜像
# 这里我就用之前做好的
docker tag 5af7ec62ebde 10.0.0.200:5000/centos-vim:v1

7.提交到私有仓库

docker push 10.0.0.200:5000/centos-vim:v1

8.其他人拉取就可以了

docker pull 10.0.0.200:5000/centos-vim:v1

dockercompose介绍

使用了docker 面临一个比较大的问题,如果一个djagno项目,使用mysql,redis,不要一次性把所有服务都放到一个容器中,每个服务一个容器,批量的管理多个容器,比较难以操作,于是有了docker-compose

docker-compose 是一個能一次性定义和管理多个Docker容器的工具

compose 中定义和启动每一个容器都相当于一个服务,可以定义和启动多个服务( 容器),且他们之间通常具有协同的关系

通常使用YAML文件来配置我们的项目的配套服务(mysql,redis)

安装docker-compose

wget https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-linux-x86_64

拷贝到指定目录

cp ./docker-compose-linux-x86_64 /usr/local/bin/docker-compose

加执行权限

chmod +x /usr/local/bin/docker-compose

常用命令

docker-compose up  # 会自动搜索当前路径下的 docker-compose.yml文件
docker-compose -f 指定文件 up
docker-compose up -d  # 后台执行,一般我们看日志输出,不用这个

docker-compose stop  # 停止,不会删除容器和镜像
docker-compose down # 停止,并删除关联的容器
docker-compose start  # 启动yml文件管理的容器
docker-compose ps    # 正在运行的容器
docker-compose images # docker-compose管理的镜像

docker-compose exec yml文件中写的service /bin/bash  # 进入到容器内

练习:

使用dockercompose部署flask+redis项目

新建一个flask项目 app.py

from flask import Flask
from redis import Redis
import os
import socket

app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST','127.0.0.1'),port=6379) # 可以传password

@app.route('/')
def hello():
    redis.incr('hits')
    return '你好! 我是你爸爸,你过来看我%s 次' % redis.get('hits')


if __name__ == "__main__":
    app.run(host='0.0.0.0',port=5000,debug=True)

在项目下编写一个Dockerfile

FROM python:3.8
WORKDIR /app
COPY . /app
RUN pip install flask redis -i https://pypi.tuna.tsinghua.edu.cn/simple
EXPOSE 5000  # 暴露端口
CMD ["python", "app.py"]

编写docker-compose的yaml文件docker-compose.yml

version: "3"
services:    # 一个services就是一个容器
  redis:
    image: redis    # 指定镜像
  web:    # 其实就是flask项目
    build:       # 需要使用dockerfile构建出image
      context: .    # 从当前路径下找Dockerfile
      dockerfile: Dockerfile   # 文件名就叫Dockerfile
    ports:    # -p的意思
      - 8080:5000  # 映射端口
    environment:
      REDIS_HOST: redis  # 拿到redis配置的REDIS_HOST
          

推到gitee上,在到docker里,进入项目目录

docker-compose up

查看运行的容器和镜像

docker-compose ps
docker-compose ps -a # 查所有
docker-compose image

直接访问10.0.0.200:8080 就可以看到了

删除容器

docker-compose down

创建容器,发现访问网址和以前一样,是因为原来的镜像并没有删

docker-compose up -d

进入容器和以前的命令一样

docker exec -it 容器id /bin/bash
docker exec -it web /bin/bash  # 名字就是我们在docker-compose.yml写的那个名字

ping命令下载

apt-get update
apt-get install inetutils-ping
ping redis