在上手之前,先总结下docker 里面常见的命令。
> 以下的 container 和 images分别表示容器和镜像的id或名字
>#查看镜像 docker images>#查看正在运行的容器信息 docker ps >#查看所有容器 docker ps -a>#基于镜像首次生成容器 docker run -it images:tag bash>#以交互式方式打开已有容器 docker exec -it container bash>#启动容器/停止容器 docker start /stop container>#容器生成镜像 docker commit container new_images_name>#从宿主机复制文件到容器内 docker cp [local:path] container:path>#镜像监听端口映射宿主机端口 docker run -p [local:port]:[images:port] images
话不多说,直接上手
1、Docker安装(Windos系统下)
注意:windows操作系统需要启用hyper-V和适用于Linux子系统
确保上述三项设置均已完成后,可直接安装docker了。
1.1 软件安装
话不多说,直接上docker安装官方链接
打开连接,如图所示,本机为win10系统,大家可根据自己本机的操作系统下载所需docker软件包
双击软件,点击“下一步”,安装即可,没什么可讲的
安装后可直接在桌面双击打开docker desktop软件应用
看到通知栏这个“鲨鱼”标志,意味着docker已经启动了。另外,也可以使用如下命令判断
docker version
这里分了Client和Server。
client可以理解为安装在pc端的docker desktop软件,每次使用时都需要将客户端应用启动,否则运行任何docker命令都会提示连接不到客户端,也展示了宿主机当前的操作系统windows;
Server中显示Linux/amd64,这是因为在默认安装方式下,windows版docker上运行的容器是基于linux系统的。
如果想要在运行windows容器,可以右击通知栏中的”鲸鱼“图标,选择 ”switch to windows containers…",可切换到windows容器。
注意:客户端显示的windows/adm64,表示我的docker装在了windows系统下,服务端显示的linux/adm64,表示我即将在linux环境下创建容器。
2、使用docker镜像,执行简单的python脚本文件
创建一个简单的脚本文件app.py,使用flask服务,定义一个返回hello,world的路由函数。主函数在启动flask服务之前,先打印一遍hello,world,便于展示。
from flask import Flask
app = Flask(__name__)@app.route('/')defhello_world():return'Hello World!'if __name__ =='__main__':print("hello,world")
app.run()
2.1 构建镜像
构建方式: 创建镜像有三种方式,分别为基于已有镜像、基于Dockerfile文件以及基于本地模板创建。
本文使用基于Dockerfile文件的方式去创建镜像,Docker 可以通过读取 Dockerfile 中的指令自动构建镜像,文件中包含了用户创建镜像的所有命令和说明,一些常见的命令如下所示。
指定基础镜像,这里指python3.9环境
FROM python:3.9
指定容器中的默认工作目录
WORKDIR /TestA
将本地文件添加到镜像中
ADD requirements.txt /TestA
镜像构建时执行的命令,比如安装依赖包文件
RUN pip install -r requirements.txt -ihttps://pypi.tuna.tsinghua.edu.cn/simple
设置容器执行后自动执行的命令,app.py”是项目的执行入口
CMD [“python”,“app.py”]
如果想详细学习Dockerfile指令,可参考以下链接
2.2 构建自己的镜像
首先需要创建一个空文件(无任何后缀),名字叫 Dockerfile ,复制如下指令到该文件中。
# 使用官方Python3.9镜像作为基础镜像
FROM python:3.9
# 设置工作目录
WORKDIR /TEST
# 复制当前目录下的requirements.txt到容器的/app目录
ADD app.py /TEST
# 安装flask包
RUN pip install flask -i https://pypi.tuna.tsinghua.edu.cn/simple
# 设置容器启动时执行的命令
CMD ["python","app.py"]
将用到的两个文件放到目录TestA下,在TestA目录下,使用Docker命令构建自己的镜像
构建镜像命令:docker build -t [image-name] .
image-name是自己构建新镜像的名称,后面符号 . 表示在当前cmd目录下构建镜像,我这里镜像名字是 test。切记,构建前一定要启动docker应用软件,否则会报错
构建完成以后,可用docker命令查看镜像状态
查看镜像:docker images
可以看到,刚才构建的镜像test已经创建成功了。
我这里只安装了一个flask包,中途没报错。对于很多小伙伴,如果安装的包过多,或者因为网络原因,安装包的过程中会很容易报错。这种情况下,基本上构建镜像就中止了,不会成功。
如果尝试多次都不成功,可以直接放弃装包,做法是注释掉Dockerfile中pip包的指令了,并且注释掉最后一行启动容器命令CMD(我第一次没注释CMD,可以创建镜像,生成容器,但发现生成的容器怎么都起不来,大家可以自从测试),在继续执行构建镜像的命令,这样就会很轻松创建一个属于自己的镜像了,但这个镜像基本只带一个python环境,啥都没有。不过不用担心,后面可以在创建的容器中继续安装依赖包,想看这部分的小伙伴可直接跳过到第三部分内容,但是还是需要耐心看完2.3部分生成容器的一些操作,直接看第三部分会对初学伙伴抓瞎。总而言之,言而总之,都看吧
2.3 生成容器
上面成功创建了个名为test的镜像,接下来可以在已有镜像test的基础上生成容器了,构建后的镜像是不变的,只读的,可理解为类,而容器就是镜像(类)的实例化,所以一个镜像可生成多个容器。其中,生成容器可带各种参数,我玩了四种方式,欢迎大家补充。
生成交互式容器:docker run -it test:latest bash
默认以镜像自带的命令启动:docker run -it test
默认以镜像自带的命令启动,并在后台持续运行,需手动停止:docker run -itd test
默认以镜像自带的命令启动,并在后台持续运行,外加端口映射:
docker run -itd -p [local_port]:[container_port] test
以交互式方式进入已有容器:docker exec -it container_id bash
其中,-itd表示,i允许你在容器中执行交互式操作,t为容器分配一个终端,d表示创建的容器会在后台持续运行;bash是linux shell,因为我们的镜像在构建时指定cmd python app.py命令了,所以这里可以不用bash,除非我们想要和容器进行交互式操作就可以加上bash;ceshi:latest 表示 镜像名称:TAG标签,带标签不带有啥影响,目前我还不知道。
以上方式大家可自行尝试,在这里我想着重讲解 -d这个参数
下图是 以-it 方式生成容器,在生成容器的时候,自动执行了脚本命令app.py(默认以镜像自带命令启动)
插个题外话,容器在生成后,不主动删除是不会消失的,如果下次我们还想进入指定容器内,可以先查询容器的id,以id 启动容器,最后在以docker命令交互式进入。
查看运行的容器:docker ps
查看所有容器:docker ps -all
启动容器:docker start container_id
停止运行容器:docker stop container_id
删除容器:docker rm container_id
交互式进入某个指定容器:docker exec -it container_id bash
接着上面参数 -d 的问题,可按照下面图示步骤执行,左右是在两个黑窗口执行的。
可以看到,由于左侧创建的容器并没有quit,右侧以交互式方式进入该容器内,查询运行的进程,看到python app.py在运行中。
问题来了,假如在左侧窗口按下ctrl+c,与此同时,右侧黑窗口直接从容器中强退出来了。
当然还可以用另一种方式验证刚才的容器是不是死掉了,大家不妨可以用docker ps ,发现刚才的容器id已经没了,别忘了这个命令是用来显示运行中的容器,用docker ps -a,显示刚才的容器了。这就表明以-it创建的容器,链接的容器终端在,容器就在,终端quit容器就死了。
现在可以用-itd命令创建容器,仍用刚才的方式验证有何不同呢?
以-itd创建的容器,直接返回了一串数字。就quit了。新开的窗口查询该容器,在运行,进入容器,查看进程,python app.py在运行中。
敲重点:加上-d这个参数,就不用担心,假设一不小心容器退出终端就彻底死了,这种方式可以让容器在后台运行,除非主动停止。
2.4 端口映射
接下里,学习端口映射,因为我们的flask服务是在指定容器内启动的,如果想在本机上直接访问容器上的服务,就得将本机服务的监视端口和该容器上的端口做个映射。
我目前只找到,在创建容器时就必须得加上端口映射的指令,所以这里是重新创建了带端口映射的指令,如下图;
对于已经创建好的docker容器,我没找到方法去做端口映射,有好方法,欢迎大家留言解惑。可以看到,上述命令不光创建了基于test镜像的容器,还直接做了宿主机和容器的端口映射,而且该容器会在后台持续运行,这个时候启动flask服务,就可以直接在本机上访问该服务了。
3、容器内安装依赖
这部分主要回顾,上面提到的构建镜像时安装依赖总是报错的问题,当时让大家直接注释掉安装依赖和CMD的命令,先生成一个python环境 。
3.1容器内安装依赖
接下来呢,我们可以在容器内安装依赖,并将容器打包成镜像使用。
首先以交互式命令进入到已生成的容器内,可直接使用pip 命令安装,此时交互式操作可以认为是在linux系统的黑窗口中,大家尽可能尝试linux中的很多命令。
docker exec -it container_id bash
pip list
pip intsall flask
安装好依赖包后,可直接执行脚本文件了。在这里我们在构建镜像的时候就将app.py文件添加进来了,如果想添加新的文件到容器内,可以使用docker 复制命令
docker cp [local:path] container:path
在此操作之前,需要在容器内安装sudo,因为我们在构建镜像时是没有安装sudo的,主要原因是构建的镜像是基于python环境的基础镜像构建,没有关注操作系统,而docker默认本身自带的基本操作系统环境是Debian,它也是Linux发行版之一,不同于Ubuntu等其他发行版,该发行版更遵循自由创作原则,所以通常不具备基本的命令行工具,比如,在容器内执行sudo命令会提示:
bash: sudo: command not found
容器内安装sudo命令,lsof命令(主要用于容器内查询占用端口号)
apt-get update
apt-get install -y sudo
执行容器内的脚本文件,可以看到成功输出hello world(我这里去掉了启动flask服务,所以只有打印)
3.2 基于容器生成新的镜像
docker可以将容器重新生成镜像,这里是将刚才的容器生成了新的镜像new_image
docker commit container_id new_image:0.0.1
此时,可以使用 docker images 查看新的镜像已经存在了
在新的镜像new_image 下,生成一个新的容器,在新容器下直接执行脚本文件。
以上内容来自自己初次尝试玩docker,有错误或者说明不合适地方,还请多多指正。
版权归原作者 码农市民小刘 所有, 如有侵权,请联系我们删除。