Dockfile构建项目,docker远程项目,dockercompose使用
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项目
- 有一个写好的项目,在项目路径下新建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搭建私有仓库
- 拉取镜像
docker pull registry
- 运行容器
docker run -id --name=registry -p 5000:5000 registry
- 修改daemon.json
vi /etc/docker/daemon.json
{
"insecure-registries":["ip:5000"]
}
- 重启docker
systemctl restart docker
docker start registry
- 打开浏览器访问
http://10.0.0.200:5000/v2/_catalog
看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空
- 把某个镜像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