【Docker】入门与使用,常用命令集合

Docker

- 编写Dockerfile,并使用docker build编译一个docker镜像,能够运行mindspore官方示例/或者mmdetection框架下的训练。进入https://harbor.apulis.cn:8443/ 创建测试project,并推送至新建的project中。 需要了解常用的命令,以及参数的意义 [操作参考链接](docker命令)

- 启动容器命令 `docker run --privileged -it -name 启动后的容器名称 需要启动的镜像名/ID bash `

- 进入容器命令 `docker exec 启动后的容器名称 bash`

Docker是什么?

Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。比如,你在本地用Python开发网站后台,开发测试完成后,就可以将Python3及其依赖包、Flask及其各种插件、Mysql、Nginx等打包到一个容器中,然后部署到任意你想部署到的环境。

Docker官方文档比较全,建议有能力的读一下官方文档


 

Docker的基本概念

  1. 镜像(Image):类似于虚拟机中的镜像,是一个包含有文件系统的面向Docker引擎的只读模板。例如一个Ubuntu镜像就是一个包含Ubuntu操作系统环境的模板

  2. 容器(Container):可以将其看作一个极简的Linux系统环境,以及运行在其中的应用程序。Docker引擎利用容器来运行、隔离各个应用。容器是镜像创建的应用实例,可以创建、启动、停止、删除容器,各个容器之间是是相互隔离的,互不影响。

  3. 仓库(Repository):类似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方。常使用的有本地harbor以及官方dockhub.com

Docker的安装和卸载

Docker可以安装在Windows、Linux、Mac等各个平台上。具体可以查看文档Install Docker。其中windows可以更新系统版本后,使用wsl2进行安装。安装完成之后,可以查看Docker的版本信息:

查看Docker的帮助信息:docker --help。各种命令的用法也不再赘述,后边用到哪些命令时会作出一定的解释。

 
 

Docker中关于镜像的基本操作

安装完Docker引擎之后,就可以对镜像进行基本的操作了。

可以从官方注册服务器(https://hub.docker.com)的仓库中pull下alpine的镜像,每个仓库会有多个镜像,用tag标示,如果不加tag,默认使用latest镜像:

 关于alpine可以参考另一篇博文,简单理解他为一个极简版的Ubuntu,仅仅只有5M

如何优雅的编写Dockerfile_子韵如初的博客-CSDN博客
 

以上是下载一个已有镜像,此外有两种方法可以新建自有镜像。

(1)利用镜像启动一个容器后进行修改,通过docker commit提交将容器打包成一个镜像

 --rm 的作用是在容器停止后删除该容器,-it代表以交互模式运行容器,并且给容器分配一个终端

 进入到容器之后,你会发现前缀由root改变成了/,这个有利于我们区分自己是否在容器中

此时新建一个终端,或者通过ctrl+p+q退回宿主机,使用docker ps可以看到正在运行的容器,id为ba890

 通过执行docker commit   {container-id}  期望的名字。将容器转化为一个镜像,完成后可使用docker images查看:

此时Docker中就有了我们新建的镜像xky-test:latest,此镜像和原有的alpine镜像区别在于多了python3,因此size大了50mb。此时我们利用新镜像创建的容器,本身就自带python3了。

由于容器是与宿主独立的,与世隔绝,可以使用 -net host让容器共享宿主机网络。

其中比较重要的是-v参数,主要作用是将宿主机的目录挂载进入容器。可以简单地理解为,容器和宿主机共享了一个目录,里面改动外面也是改动,因为他们访问的实质上是同一个目录


可以看到,原本为空的/mnt目录,现在跟宿主机的目录一样了。需要注意的是,如果使用commit将容器保存成镜像的话,是不会保存挂载的/mnt目录的

(2)利用Dockerfile创建镜像

Dockerfile可以理解为一种配置文件,用来告诉docker build命令应该执行哪些操作。一个简易的Dockerfile文件如下所示,官方说明:Dockerfile reference

# 说明该镜像以哪个镜像为基础
FROM alpine:latest

# 构建者的基本信息
MAINTAINER xky

# 在build这个镜像时执行的操作
RUN apk update
RUN apk add python3
# 拷贝本地文件到镜像中
COPY . /

# 添加环境变量
ENV PYTHONPATH=/usr/local

有了Dockerfile之后,就可以利用build命令构建镜像了:

docker build -t xky-build -f test.docker .

其中-t用来指定新镜像的用户信息、tag等。最后的点表示运行在当前目录,如果dockerfile文件叫做test.docker那么可以添加 -f test.docker。

可以看到build完成 

构建完成之后,同样可以使用docker images命令查看:

以上就是构建自己镜像的两种方法。其中也涉及到了容器的一些操作。如果想删除容器或者镜像,可以使用rm命令,注意:删除镜像前必须先删除以此镜像为基础的容器。

[root@DESKTOP-79MCU4I]# docker rm container_name/container_id
[root@DESKTOP-79MCU4I]# docker rmi image_name/image_id

镜像其他操作指令:

[root@DESKTOP-79MCU4I]# docker save -o docker.tar xky-test    # 保存镜像, -o也可以是--output
[root@DESKTOP-79MCU4I]# docker load -i docker.tar    # 加载镜像, -i也可以是--input

Docker中关于容器的基本操作

在前边镜像的章节中,我们已经看到了如何基于镜像启动一个容器,即docker run操作。

[root@xxx ~]# docker run -it centos:latest /bin/bash

这里-it是两个参数:-i和-t。前者表示打开并保持stdout,后者表示分配一个终端(pseudo-tty)。此时如果使用exit退出,则容器的状态处于Exit,而不是后台运行。如果想让容器一直运行,而不是停止,可以使用快捷键 ctrl+p ctrl+q 退出,此时容器的状态为Up。

除了这两个参数之外,run命令还有很多其他参数。其中比较有用的是-d后台运行:

docker run alpline:latest /bin/bash -c "while true; do echo hello; sleep 1; done"
docker run -d alpline:latest /bin/bash -c "while true; do echo hello; sleep 1; done"

这里第二条命令使用了-d参数,使这个容器处于后台运行的状态,不会对当前终端产生任何输出,所有的stdout都输出到log,可以使用docker logs container_name/container_id查看。

启动、停止、重启容器命令:

[root@DESKTOP-79MCU4I]# docker start container_name/container_id
[root@DESKTOP-79MCU4I]# docker stop container_name/container_id
[root@DESKTOP-79MCU4I]# docker restart container_name/container_id

后台启动一个容器后,如果想进入到这个容器,可以使用attach命令:

[root@DESKTOP-79MCU4I]# docker attach container_name/container_id

Docker中关于仓库的基本操作

Docker官方维护了一个DockerHub的公共仓库,里边包含有很多平时用的较多的镜像。除了从上边下载镜像之外,我们也可以将自己自定义的镜像发布(push)到DockerHub上。

在镜像操作章节中,我们新建了一个xianhu/centos:git镜像。

(1)访问https://hub.docker.com/,如果没有账号,需要先注册一个。

(2)利用命令docker login登录DockerHub,输入用户名、密码即可登录成功:

[root@DESKTOP-79MCU4I]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: xky
Password:
Login Succeeded

(3)将本地的镜像推送到DockerHub上,这里的xianhu要和登录时的username一致:

[root@DESKTOP-79MCU4I]# docker push xky-test

(4)以后别人就可以从你的仓库中下载合适的镜像了。

[root@DESKTOP-79MCU4I]# docker pull xky-test

对应于镜像的两种创建方法,镜像的更新也有两种:

  • 创建容器之后做更改,之后commit生成镜像,然后push到仓库中。
  • 更新Dockerfile。在工作时一般建议这种方式,更简洁明了。

这里再一次回顾一下三个重要的概念:镜像、容器、仓库:

从仓库(一般为DockerHub)下载(pull)一个镜像,Docker执行run方法得到一个容器,用户在容器里执行各种操作。Docker执行commit方法将一个容器转化为镜像。Docker利用login、push等命令将本地镜像推送(push)到仓库。其他机器或服务器上就可以使用该镜像去生成容器,进而运行相应的应用程序了。

Docker的功能和特性还有很多,各种运行命令、参数等也都有待学习和练习,比如如何管理数据、如何管理网络、如何互相配合工作、如何编写更专业的Dockerfile等。更多可以参考如何优雅的编写Dockerfile_子韵如初的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/weixin_43953700/article/details/123729836