Docker 使用初级指南
一篇文章掌握 Docker 初级用法
文章目录
Docker 使用初级指南
使用阿里云容器镜像服务
-
登录阿里云
-
在阿里云首页搜索并进入容器镜像服务,点击进入管理控制台
-
开通容器镜像服务,设置密码
-
创建镜像仓库。填写命名空间、仓库名称,仓库类型选择私有,完善摘要信息等仓库信息。代码源选择本地仓库。
命名空间: 命名空间是对仓库的分类
-
进入镜像仓库栏目,查看创建好的仓库,查看仓库公网地址
-
进入控制台的镜像加速器栏目,查看加速器网址
在 Windows 上安装 Docker
-
访问Docker Desktop 官网下载页面下载 Docker Desktop for Windows
-
运行安装包,安装时勾选 use windows containers instead …
-
安装完成后启动 Docker
-
修改配置加速镜像下载。进入用户文件夹下的
.docker
文件夹(C:\Users\xx\.docker\),修改daemon.json
,将其中的:“registry-mirrors”: []
改为:
“registry-mirrors”: [“阿里云镜像加速器网址”]
阿里云镜像加速器网址:
到
阿里云控制台 -> 容器镜像服务 -> 镜像加速器
栏目中查看阿里云镜像加速器网址外层的双引号为英文双引号。保存退出。
-
重启 Docker Desktop
在 Linux 上安装 Docker
-
执行命令从脚本安装:
curl -o get-docker.sh https://get.docker.com/ && sudo sh get-docker.sh
-
如果想要以非 root 用户身份使用 docker,执行命令:
sudo usermod -aG docker 用户
用户: 使用 docker 的非 root 用户的用户名
-
重启 Linux。执行命令:
sudo reboot
-
修改配置加速镜像下载。执行命令:
sudo nano /etc/docker/daemon.json
将其中的:
“registry-mirrors”: []
改为:
“registry-mirrors”: [“阿里云镜像加速器网址”]
阿里云镜像加速器网址:
到
阿里云控制台 -> 容器镜像服务 -> 镜像加速器
栏目中查看阿里云镜像加速器网址外层的双引号为英文双引号。如果不存在
registry-mirrors
项则需要手动添加,数据项之间要用逗号,
隔开。修改完成后保存退出。 -
重启 docker。执行命令:
sudo systemctl daemon-reload sudo systemctl restart docker
建立本地 Docker 镜像仓库
在本地建立 Docker 镜像仓库能够提升局域网内镜像下载、上传的速度,进一步提高镜像仓库的安全性。下面以在 Windows 上建立本地 Docker 镜像仓库为例,讲解 Docker 常用命令。
下载官方 Docker 镜像
docker.io 是 Docker 官方公共镜像库,但在中国大陆的访问网络速度不理想。因此需要配置镜像加速器。在安装 Docker 时已经配置好镜像加速器。
建立本地 Docker 镜像仓库的第一步是下载官方仓库镜像registry,在 Windows 控制台中执行命令:
docker pull registry
docker pull
命令从镜像仓库下载镜像,参数为 仓库名称:镜像版本
。上述命令中 registry 是子仓库名称,父仓库名称的缺省值是 docker.io,镜像版本的缺省值是 latest,因此上述命令等价于:
docker pull docker.io/registry:latest
提示:
如果是从私有仓库下载镜像,需要拥有正确的仓库登录凭证,即登录仓库的用户名和密码
登录镜像库
从私有仓库下载镜像需要拥有正确的登录凭证。以在 Linux 上登录阿里云私有镜像库为例,在 Linux 终端中执行命令:
docker login registry.cn-hangzhou.aliyuncs.com/telephone2020/linux
执行上述命令后您将会被询问用户名和密码,输入相应私有仓库的正确的登录用户名和密码,您输入的用户名和密码就会被保存为一个登录凭证。
在上述命令中,docker login
命令将询问用户所得到的一对用户名密码作为指定仓库的一个凭证保存起来,参数为私有仓库的地址,参数缺省值是 docker.io
私有仓库的地址: 即仓库的名称,包括父仓库名称和子仓库名称
在上述命令中,registry.cn-hangzhou.aliyuncs.com/telephone2020/linux 是笔者的阿里云私有 Docker 镜像仓库的公网地址,registry.cn-hangzhou.aliyuncs.com/telephone2020 是父仓库名称,linux 是子仓库名称。
提示:
阿里云私有仓库的登录用户名是阿里云账号全名,密码为开通服务时设置的密码。
查看已存储的登录凭证
登录完成后,
-
在 Windows 中可以查看用户文件夹下的
.docker
文件夹中的config.json
文件(C:\Users\xx\.docker\config.json),文件中的auths
项记录了已存储凭证的仓库的网址 -
在 Linux 中可以查看
~/.docker/config.json
,执行命令cat ~/.docker/config.json
文件中的
auths
项记录了已存储凭证的仓库的网址
登出镜像库
可以通过登出镜像库来移除已存储的登录凭证,执行命令:
docker logout xxx
xxx: 私有仓库的地址,即仓库的名称,包括父仓库名称和子仓库名称
docker logout
命令移除已存储的指定仓库的凭证,参数与 docker login
命令相同,是私有仓库的地址,参数缺省值是 docker.io
查看本地镜像列表
可以使用 docker images
命令查看存在于本地的镜像列表。执行命令:
docker images
从镜像中创建并启动容器
可以使用 docker run
命令从镜像中创建并启动容器。建立本地 Docker 镜像仓库的第二步是运行官方仓库镜像registry,在 Windows 控制台中执行命令:
docker run -d -p 5001:5000 --restart=always --name myRegistry registry
上述命令从镜像 registry 创建并启动了一个容器。-d
指定以后台方式运行这个容器,这样即使关闭了控制台也不会关闭运行中的容器。-p 5001:5000
指定了把 Windows 系统的 5001 端口映射到容器的 5000 端口。--restart=always
指定了当重启 Docker 时容器也会自动重启。--name myRegistry
指定了容器名为 myRegistry。registry
是镜像名称。镜像名称的版本号缺省值是 latest,因此上述命令等价于:
docker run -d -p 5001:5000 --restart=always --name myRegistry registry:latest
执行上述命令后,会显示一个容器ID,这个就是容器myRegistry的ID。
新建防火墙入站规则
如果打开了 Windows 防火墙,则需要新建用于访问本地镜像仓库的入站规则。步骤如下:
进入 Windows 控制面板 --> 查看方式选择 “小图标” --> 进入 “Windows Defender 防火墙” --> 高级设置 --> 入站规则 --> 新建规则 --> 端口 --> TCP,特定本地端口:5001 --> 允许连接 --> 选择规则的适用网络类型(或保持默认) --> 填写名称、描述 --> 完成
修改配置访问本地镜像仓库
普通的本地自建仓库不支持 HTTPS 协议,因此需要访问本地镜像仓库还需要修改配置。
以在 Linux 访问 Windows 上的自建本地镜像仓库为例,执行命令:
sudo nano /etc/docker/daemon.json
将其中的:
“insecure-registries”:[]
改为:
“insecure-registries”:[“192.168.1.106:5001”]
192.168.1.106
是笔者 Windows 的局域网 IP 地址,5001
是映射到本地自建仓库容器的 Windows 端口。如果不存在insecure-registries
项则需要手动添加,数据项之间应用逗号 ,
隔开。修改完成后保存退出。
重启 docker,执行命令:
sudo systemctl daemon-reload
sudo systemctl restart docker
提示:
如果是在 Windows 上访问自建的本地镜像仓库,步骤大同小异,配置文件位于用户文件夹下的.docker
文件夹(C:\Users\xx\.docker\daemon.json)
查看正在运行的容器
使用 docker ps
查看正在运行的容器。不加参数的 docker ps
会显示出正在运行的容器。这条命令有两个常用的附加参数:
docker ps -a //显示所有容器而非只显示正在运行的容器
docker ps -q //只显示容器的ID而不显示其他的详细信息
停止正在运行的容器
使用 docker stop xx
命令可以停止正在运行的容器。
xx: 需要停止运行的容器ID
删除容器
使用 docker rm xx
命令可以删除容器。删除指定容器之前应先停止运行该容器。
xx: 需要删除的容器ID
把 Linux 系统打包成 Docker 镜像
让我们试着把 Linux 系统的当前状态打包成一个 Docker 镜像。
-
首先,使用
tar
命令打包系统。执行命令:sudo tar --numeric-owner --exclude=/proc --exclude=/sys -cvf myLinux.tar /
–numeric-owner:以UID和GID代替用户名和组名
–exclude=/proc:不打包 /proc 目录,/proc 目录在 Linux 中默认用于记录正在运行的内核信息
–exclude=/sys:不打包 /sys 目录,/sys 目录在 Linux 中默认用于记录硬件设备的驱动程序信息
-c:创建新的存档
-v:详细显示处理的文件
-f:指定存档的文件名
myLinux.tar:新创建的存档文件名为 myLinux.tar
/:需要打包的目录为根目录
-
然后,使用
docker import
从归档文件中创建镜像。执行命令:docker import myLinux.tar myFirstImage:v1
这条命令从我们刚创建的归档文件 myLinux.tar 中创建一个新的镜像,
myLinux.tar
指定了要从中创建新镜像的归档文件,myFirstImage
是新镜像的名称,v1
是新镜像的版本号
重命名镜像
让我们尝试把创建的新镜像分别推送到阿里云私有仓库和本地自建的镜像仓库。
在把本地镜像推送到仓库之前,确保本地镜像的名称为 要推送到的仓库名称:镜像版本号
,其中仓库名称可以仅包含子仓库名称,推送镜像时父仓库名称的缺省值是 docker.io。
使用 docker tag
命令可以重命名镜像。执行命令:
-
上传到阿里云私有仓库
docker tag myFirstImage:v1 阿里云私有仓库公网地址:v1
阿里云私有仓库公网地址: 之前查看到的阿里云私有仓库公网地址
-
上传到本地自建仓库
docker tag myFirstImage:v1 192.168.1.106:5001:v1
其中
192.168.1.106
是笔者 Windows 的局域网 IP 地址,5001
是映射到本地自建仓库容器的 Windows 端口。如果想要在自建的仓库中创建子仓库,并将本地镜像上传到子仓库中,例如,想要上传到本地自建仓库下的linux
子仓库中,可以改为执行以下命令:docker tag myFirstImage:v1 192.168.1.106:5001/linux:v1
将镜像推送到仓库
在推送镜像到私有仓库前,请确保您已经登录相应的仓库。之前已经在 Linux 上登录了阿里云的私有仓库,普通的本地自建仓库默认是共有仓库,因此无需登录。
使用 docker push 可以将本地镜像推送到仓库中。执行命令:
-
阿里云私有仓库
docker push registry.cn-hangzhou.aliyuncs.com/telephone2020/linux:v1
其中
registry.cn-hangzhou.aliyuncs.com/telephone2020/linux
是笔者的阿里云私有仓库的公网地址 -
本地自建仓库
docker push 192.168.1.106:5001/linux:v1
查看已上传到本地自建仓库中的镜像
在 Windows 中访问(因为本地自建仓库位于 Windows 上) http://localhost:5001/v2/_catalog 即可查看已经上传到本地自建仓库中的镜像
5001 是启动仓库容器时指定的 Windows 映射端口
删除本地镜像
使用 docker rmi xxx
即可删除指定的本地镜像。
xxx: 镜像名称,格式为
仓库名称:TAG
,两者均可在docker images
返回的镜像列表中找到
TAG: 即镜像的版本号
提示:
当一个本地镜像被多次重命名后,本地镜像列表中会存在多个内容相同但镜像名不同的镜像,这时它们均指向同一个本地镜像。如果使用 docker rmi
命令删除拥有多个镜像名的本地镜像,则只有镜像名会被删除;当试图删除仅存的一个镜像名时,本地镜像的内容才会被删除。
让我们测试一下本地自建仓库。
使用
docker rmi
命令删除 Linux 上所有的本地镜像,
然后使用
docker pull
命令拉取本地自建仓库中刚上传的镜像,
最后使用
docker images
命令查看本地镜像列表。
如果本地自建仓库中的镜像被成功下载,那么说明本地自建仓库能够正常工作。
以不同的方式运行容器
可以把容器视为一个操作系统。通常情况下,我们要考虑以下三种运行系统的不同方式:
- 带有默认的开机启动程序,用户需要运行自定义的程序
- 带有默认的开机启动程序,用户无需运行自定义的程序
- 不带默认的开机启动程序,用户需要运行自定义的程序
不带默认的开机启动程序,用户无需运行自定义的程序(这样的操作系统要来干嘛?)
设
开机启动程序为
START-CMD
,开机启动程序的参数1为
START-PAR1
,开机启动程序的参数2为
START-PAR2
,用户要运行的自定义程序为
USER-CMD
,用户要运行的自定义程序的参数1为
USER-PAR1
,用户要运行的自定义程序的参数2为
USER-PAR2
,镜像名称为
<image>
,容器的其他运行参数1为
DOCKER-PAR1
,容器的其他运行参数2为
DOCKER-PAR2
。
相应地,给出三种启动容器的方法:
-
带有默认的开机启动程序,用户需要运行自定义的程序
ENTRYPOINT ["START-CMD" , "START-PAR1" , "START-PAR2"]
docker run DOCKER-PAR1 DOCKER-PAR2 -it <image> USER-CMD USER-PAR1 USER-PAR2
ENTRYPOINT: Dockerfile 的内容项之一,Docker 高级用法
-it: 此参数指定将容器的标准输入输出映射到 Linux 标准输入输出,以此参数执行
docker run
后,Linux 终端将会进入容器内部的标准输入输出(除非存在-d
参数),若要断开此映射连接,按ctrl + p + q
提示:
开机启动程序的参数中若存在需要解析的变量,请在"START-CMD"
前添加"sh" , "-c"
,例如:将
ENTRYPOINT ["echo" , "-n" , "$HOME"]
改为ENTRYPOINT ["sh" , "-c" , "echo -n $HOME"]
-
带有默认的开机启动程序,用户无需运行自定义的程序
ENTRYPOINT ["START-CMD" , "START-PAR1" , "START-PAR2"]
docker run DOCKER-PAR1 DOCKER-PAR2 -it <image>
ENTRYPOINT: Dockerfile 的内容项之一,Docker 高级用法
-it: 此参数指定将容器的标准输入输出映射到 Linux 标准输入输出,以此参数执行
docker run
后,Linux 终端将会进入容器内部的标准输入输出(除非存在-d
参数),若要断开此映射连接,按ctrl + p + q
提示:
开机启动程序的参数中若存在需要解析的变量,请在"START-CMD"
前添加"sh" , "-c"
,例如:将
ENTRYPOINT ["echo" , "-n" , "$HOME"]
改为ENTRYPOINT ["sh" , "-c" , "echo -n $HOME"]
-
不带默认的开机启动程序,用户需要运行自定义的程序
ENTRYPOINT []
docker run DOCKER-PAR1 DOCKER-PAR2 -it <image> USER-CMD USER-PAR1 USER-PAR2
ENTRYPOINT: Dockerfile 的内容项之一,Docker 高级用法
-it: 此参数指定将容器的标准输入输出映射到 Linux 标准输入输出,以此参数执行
docker run
后,Linux 终端将会进入容器内部的标准输入输出(除非存在-d
参数),若要断开此映射连接,按ctrl + p + q
将 Linux 标准输入输出连接到容器内部
docker run
命令的 -it
参数指定将容器的标准输入输出映射到 Linux 标准输入输出,建议作为从镜像启动容器的必备参数。使用 -it
参数执行 docker run
后,除非同时使用了 -d
参数,Linux 终端将会进入容器内部的标准输入输出,若要断开此映射连接,按 ctrl + p + q
。
若使用了 -d
参数或手动断开了映射连接,可以执行 docker attach
再次映射一个以参数 -it
启动的正在运行的容器。
docker attach xxx
xxx: 需要映射的容器ID,可通过
docker ps
查看
在 Linux 容器内执行多条命令
使用以下命令来实现在 Linux 容器内执行多条命令:
docker run --some-parameters -it <image> /bin/bash
或
docker run --some-parameters -dit <image> /bin/bash
docker attach xxx
–some-parameters: 容器的一些启动参数
<image>: 镜像名称,包括仓库名称和版本号,版本号缺省值是 latest
xxx: 执行
docker run
后返回的容器 ID
执行上述命令后 Linux 终端会进入容器内部的标准输入输出,按 ctrl + p + q
退出容器内部。这种情况下在容器内部按 ctrl + c
不会中断映射或停止容器,而会中断容器内部的命令执行。
将容器另存为新的镜像
如果需要从一个容器的当前状态创建一个新的镜像,可以使用 docker commit
命令:
docker commit xxx RE:TAG
xxx: 需要从中创建镜像的容器ID
RE: 镜像名称中的仓库名称部分
TAG: 镜像名称中的镜像版本号部分
执行 docker commit
命令时,如果容器正在运行,容器会自动暂停,docker commit
命令执行完后会自动恢复。
更多推荐
所有评论(0)