Docker:windows系统下初次尝试docker,有踩坑

在上手之前,先总结下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安装官方链接

下载软件包链接:https://docs.docker.com/engine/install/

打开连接,如图所示,本机为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('/')
def hello_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指令,可参考以下链接

https://www.jianshu.com/p/4508784f6ddc

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(默认以镜像自带命令启动)
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/930f63199b10499793caa7ae9d11cd2b.png

插个题外话,容器在生成后,不主动删除是不会消失的,如果下次我们还想进入指定容器内,可以先查询容器的id,以id 启动容器,最后在以docker命令交互式进入。

查看运行的容器:docker ps
查看所有容器:docker ps -al
启动容器: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服务是在指定容器内启动的,如果想在本机上直接访问容器上的服务,就得将本机服务的监视端口和该容器上的端口做个映射。

当然可以在创建容器时,就直接致指定端口映射(命令都在容器生成那块统一写了,可上划),如下图在这里插入图片描述
可以看到,上述命令不光创建了基于test镜像的容器,还直接做了宿主机和容器的端口映射,而且该容器会在后台持续运行。

接下来,我在宿主机访问该服务时,不通???

查看端口映射:docker run -p 39012:5000 test

在这里插入图片描述
这个提示是说我的映射到宿主机上的端口被占用了!!

查看端口占用:netstat ano | findstr 39012
杀掉:taskkill /pid 39012对应的进程号 /F

杀完宿主机上的39012进城后,我的docker坏了,重新启动后就这个死样子,一怒之下,我重新安装了他,重复了上面的流程!!!
依旧是一样的流程,宿主机服务访问不了,杀死宿主机上端口占用进程,docker就坏了,我又重新装!!!

在这里插入图片描述

在这里插入图片描述
这个问题放到新的一篇文章去讲吧!

3、容器内安装依赖

这部分主要回顾,上面提到的构建镜像时安装依赖总是报错的问题,当时让大家直接注释掉安装依赖和CMD的命令,先生成一个python环境 。

3.1容器内安装依赖

接下来呢,我们可以在容器内安装依赖,并将容器打包成镜像使用。
首先以交互式命令进入到已生成的容器内,可直接使用pip 命令安装,此时交互式操作可以认为是在linux黑窗口中,大家尽可能尝试。

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,有错误或者说明不合适地方,还请多多指正。

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值