3. 使用
3.1启动和停止
- 启动docker服务:
systemctl start docker
- 停止docker服务:
systemctl stop docker
- 重启:
systemctl restart docker
- 查看docker状态:
systemctl status docker
- 查看docker的版本:
docker -v
- 开机自动 启动:
systemctl enable docker
3.2 docker镜像
Docker镜像可以理解为一个精简的Linux操作系统安装包。通过镜像可以快速的启动容器。
-
查看镜像:
docker images
-
拉取镜像:
-
在这里找镜像(docker hub)https://hub.docker.com/_/python/tags
-
docker pull 镜像名称:标签 # 如果拉取镜像时,不加标签,默认拉取最新的镜像,标签为latest
-
比如:拉取
redis
docker pull redis:alpine3.17
-
-
搜索镜像
docker search 镜像名称 # 不能直接搜索对应的详细版本信息,只能去网站上找: 网站地址:https://hub.docker.com/_/python/tags
-
删除镜像
# 删除镜像有三种方法 1. docker rmi 镜像名称:标签 2. docker rm -f 镜像名称:标签 3. docker rm i 镜像id
-
修改镜像名称
docker tag 老镜像名称:标签 新镜像名称:标签
-
把
redis
名称修改为redis3.7
docker tag redis:alpine3.17 redis3.17:ccx
-
再次查看镜像
-
由图可见,多了一个镜像名称为redis3.7
的镜像
-
可以删除原来的镜像
docker rmi redis:alpine3.17
3.3 docker容器
容器就是根据镜像启动的一个进程,它是一个运行的系统。
容器常用命令
-
创建容器
创建容器后会自动执行
cmd
里面的命令,通过docker image inspect python:3.7.16-slim
可以查看cmd命令是什么
如果退出容器,容器则会停止
创建容器有两种方式:
-
交互式方式创建容器
dockers run -it --name=python3.7 python:3.7.16-slim
-i
:表示以交互式方式进行容器-t
:分配一个命令终端
-
守护式方式创建容器
/bin/sh
:运行容器的时候执行的命令,会覆盖cmd
里面的命令docker run -di --name python3.7.16 python:3.7.16-slim /bin/sh
-
注意哈:如果容器名称已存在的话,创建容器会失败
可以使用
docker ps -a
来查看所有的容器
-
-
-
查看容器
# 1. 查看正在运行的容器 docker ps # 2. 查看所有容器 docker ps -a
-
删除容器
docker rm 容器名称/容器id
-
进入容器里
docker exec -it py52 /bin/sh #指定root用户登陆容器,场景是需要执行root用户才能执行的命令的时候 docker exec -it -u 0 py52 /bin/sh docker exec -it --user root py52 /bin/sh
-
退出容器
exit
退出容器后,当前容器是在运行的
-
容器的启动和停止
启动容器 docker start 容器名称(容器id) 重启容器 docker restart 容器名称(容器id) 停止容器 docker stop 容器名称(容器id) docker kill 容器名称(容器id)
- 文件拷贝
宿主机文件和容器文件是隔离的
docker cp 宿主机需要拷贝的容器或者目录 容器名称:容器目录
docker cp test.py py52:/mnt/
-
文件映射(存疑)
宿主机文件和容器文件相互同步的
docker run -v 宿主机目录(文件):容器内目录(文件)
Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所学的指令和说明
4. Dockerfile
dockerfile命令说明主要参考文章:http://testingpai.com/article/1634806562678
4.1 Dockerfile编写规则
-
指令大小写不敏感,为了区分习惯上用大写
-
Dockerfile非注释行第一行必须是FROM
-
文件名必须是Dockerfile
-
Dockerfile指定一个专门的目录为工作空间
-
所有引入映射的文件必须在这个工作空间目录下
-
Dockerfile工作空间目录下支持隐藏文件(.dockeringore)
-
(.dockeringore)作用是用于存放不需要打包导入镜像的文件,根目录就是工作空间目录
-
每一条指令都会生成一个镜像层,镜像层多了执行效率就慢,能写成一条指定的就写成一条
4.2 Dockerfile指令说明
FROM python:3-alpine # 第一行非注释行必须是FROM
WORKDIR /app #设置容器的工作空间目录
ADD ./xxx.txt /app #讲宿主机的依赖包文件添加到镜像里面
RUN pip install -r xxx.txt #安装依赖包,RUN是在打镜像的过程中执行的命令,建议少用RUN
CMD ["python","start.py"] #创建容器后自动执行的命令,但是如果启动容器的时候传了命令进去,这个命令会被覆盖
- FROM:基础 镜像
1.1、FROM是Dockerfile文件开篇第一个非注释行代码
1.2、用于为镜像文件构建过程指定基础镜像,后续的指令都基于该基础镜像环境运行
1.3、基础镜像可以是任何一个镜像文件
1.4、docker build 会在docker宿主机上查找指定的文件,如未找到会自动去Docker Hub Registry上拉取
1.5、如果没找到对应的镜像就会返回错误信息
- WORKDIR:用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY、ADD指定设定工作目录
2.1、WORKDIR /mnt,如果目录不存在会自动创建,包括他的父目录
2.2、一个Dockerfile中WORKDIR可以出现多次,其路径也可以为相对路径,相对路径是基于前一个WORKDIR路径
2.3、WORKDIR也可以调用ENV指定的变量
2.4:举例
from python:latest
workdir /mnt
run touch a.txt
workdir /usr
run touch b.txt
- ADD:类似于COPY指令,ADD支持tar文件和URL路径
3.1. 语法:ADD <src> <dest>
-
RUN:docker build镜像构建的时候需要执行的shell命令默认"/bin/sh -c"运行
1、docker build过程中需要执行的命令 2、RUN是在镜像构建完成之后运行结束 3、RUN执行的命令只能基于基础镜像的命令,执行之前先要确定基础镜像是否有该命令 4、一个Dockerfile可以写多个RUN
语法一:
语法一、RUN command1 && command2....
1、通常是shell命令且以"/bin/sh -c"来运行它,此时运行为shell的子进程
2、进程在容器中的PID!=1,不能接收unix信号,当使用docker stop 将无法接收到
3、RUN echo "test_demo" > a.txt 此时可以使用shell特性
语法二:
语法二、RUN ["executable","param1","param2"]
1、executable为要运行的命令
2、param1为命令运行的参数
3、不会以"/bin/sh -c"运行(非shell子进程),因此不支持shell操作符如变量替换和通配符(?,*等)
4、如果运行命令需要依赖shell特性可以增加参数,手动启动为shell的子进程
RUN ["/bin/bash","-c","executable","param1"]
5、list中的参数要使用双引号
-
CMD:启动容器指定默认要运行的程序或命令,默认"/bin/sh -c"运行
1、docker run过程中需要执行的命令 2、CMD运行结束后容器就将终止 3、CMD指定的命令将可以被 docker run 最后面的命令覆盖 4、一个Dockerfile写多个CMD只有最后一个CMD会生效
4.3 使用Dockerfile一个python
环境镜像
1. 编写Dokerfile文件
FROM python:3-alpine # 第一行非注释行必须是FROM
WORKDIR /app #设置容器的工作空间目录
ADD ./xxx.txt /app #讲宿主机的依赖包文件添加到镜像里面
RUN pip install -r xxx.txt #安装依赖包,RUN是在打镜像的过程中执行的命令,建议少用RUN
CMD ["python","start.py"] #创建容器后自动执行的命令,但是如果启动容器的时候传了命令进去,这个命令会被覆盖
我的dockerfile
FROM python:3.7.16-slim
WORKDIR /app
ADD requirements.txt /app
RUN pip install -r requirements.txt
CMD["python","run_server.py"]
- python中如何生产依赖包:
python freeze > xxx.txt
- 安装依赖包文件中的包:
pip install -r xxx.txt
2. 构建镜像
docker build -t 镜像名称:标签 Dockerfile所在的目录
.:表是当前目录
docker build -t .