Docker:修订间差异
无编辑摘要 |
无编辑摘要 |
||
第19行: | 第19行: | ||
方法一,添加Docker源进行安装: | 方法一,添加Docker源进行安装: | ||
<syntaxhighlight lang="bash"> | |||
#安装所需的软件包 | |||
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 | |||
#安装containerd.io软件包,不然会报错requires containerd.io >= 1.2.2-3 | |||
sudo yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm | |||
#设置官网的稳定版仓库源 | |||
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo | |||
#可选,体验版和测试版默认是关闭的,可以通过命令打开,详细见文档。 | |||
#安装最新版本的docker CE | |||
sudo yum install docker-ce | |||
#启动守护进程 | |||
sudo systemctl start docker | |||
</syntaxhighlight> | |||
也可以使用dnf命令安装,dnf为下一代yum命令。 | 也可以使用dnf命令安装,dnf为下一代yum命令。 | ||
<syntaxhighlight lang="bash"> | |||
sudo dnf -y install dnf-plugins-core | |||
sudo dnf install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm | |||
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo | |||
sudo dnf install docker-ce | |||
sudo systemctl start docker | |||
</syntaxhighlight> | |||
方法二,下载RPM包,离线安装: | 方法二,下载RPM包,离线安装: | ||
<syntaxhighlight lang="bash"> | |||
#在联网的计算机下载RPM软件包,从官网地址选一个版本下载:https://download.docker.com/linux/fedora/ | |||
#比如:docker-ce-cli-19.03.4-3.fc31.x86_64.rpm | |||
#复制到计算机的某个目录,执行安装 | |||
sudo dnf -y install docker-ce-cli-19.03.4-3.fc31.x86_64.rpm | |||
#启动守护进程 | |||
sudo systemctl start docker | |||
</syntaxhighlight> | |||
方法三,使用脚本安装: | 方法三,使用脚本安装: | ||
Docker提供脚本安装方式,快捷安装。 | Docker提供脚本安装方式,快捷安装。 | ||
<syntaxhighlight lang="bash"> | |||
#下载脚本 | |||
curl -fsSL https://get.docker.com -o get-docker.sh | curl -fsSL https://get.docker.com -o get-docker.sh | ||
#运行脚本安装 | #运行脚本安装 | ||
第61行: | 第68行: | ||
#如果以非root用户使用docker(推荐), 需要添加一个用户到'docker'用户组中 | #如果以非root用户使用docker(推荐), 需要添加一个用户到'docker'用户组中 | ||
#查看是否添加成功,如果添加当前登录的用户,需要重新登录,组权限才会生效。 | |||
sudo usermod -aG docker your-user-name | sudo usermod -aG docker your-user-name | ||
#查看是否安装成功 | #查看是否安装成功 | ||
docker --version</ | docker --version | ||
</syntaxhighlight> | |||
{{了解更多 | {{了解更多 | ||
|[https://docs.docker.com/engine/install/centos/ Docker文档-centos安装Docker引擎] | |[https://docs.docker.com/engine/install/centos/ Docker文档-centos安装Docker引擎] | ||
}} | }} | ||
====Ubuntu==== | ====Ubuntu==== | ||
[[Ubuntu]]安装Docker也有三种方法,与[[CentOS]]安装docker类似。 | [[Ubuntu]]安装Docker也有三种方法,与[[CentOS]]安装docker类似。 | ||
方法一,添加Docker源进行安装: | 方法一,添加Docker源进行安装: | ||
<syntaxhighlight lang="bash"> | |||
#获取apt可用最新列表 | |||
sudo apt-get update | sudo apt-get update | ||
#使用apt安装下列软件包 | #使用apt安装下列软件包 | ||
第101行: | 第112行: | ||
#使用非root用户使用docker,可以将用户添加到docker组: | #使用非root用户使用docker,可以将用户添加到docker组: | ||
sudo gpasswd -a ${USER} docker #将当前用户添加到docker组,重新登录后生效 | sudo gpasswd -a ${USER} docker #将当前用户添加到docker组,重新登录后生效 | ||
sudo usermod -aG docker your-user #将其他用户添加到docker组</ | sudo usermod -aG docker your-user #将其他用户添加到docker组 | ||
</syntaxhighlight> | |||
{{了解更多 | {{了解更多 | ||
第110行: | 第122行: | ||
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。 | 当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。 | ||
===镜像使用=== | ===镜像使用=== | ||
==== | ====查看本地镜像==== | ||
可以使用 docker images 来列出本地主机上的镜像。 | 可以使用 docker images 来列出本地主机上的镜像。 | ||
docker images | docker images | ||
docker image ls | docker image ls | ||
输出结果说明: | 输出结果说明: | ||
*REPOSITORY:表示镜像的仓库源 | *REPOSITORY:表示镜像的仓库源 | ||
第121行: | 第134行: | ||
*SIZE:镜像大小 | *SIZE:镜像大小 | ||
====删除镜像==== | |||
删除镜像文件使用<code>docker image rm</code>命令或<code>docker rmi</code>,如 | |||
docker image rm Ubuntu | docker image rm Ubuntu | ||
docker rmi Ubuntu | docker rmi Ubuntu | ||
====下载镜像==== | ====下载镜像==== | ||
下载镜像,使用docker pull命令,默认从Docker镜像仓库[https://hub.docker.com/ Docker Hub]上下载。 | 下载镜像,使用docker pull命令,默认从Docker镜像仓库[https://hub.docker.com/ Docker Hub]上下载。 | ||
<syntaxhighlight lang="bash"> | |||
#默认下载tag: latest的版本, | |||
docker pull ubuntu | docker pull ubuntu | ||
#指定镜像版本 | #指定镜像版本 | ||
docker pull ubuntu:18.04 </ | docker pull ubuntu:18.04 | ||
</syntaxhighlight> | |||
====仓库搜索镜像==== | ====仓库搜索镜像==== | ||
使用 docker search 命令来搜索镜像,默认从Docker镜像仓库[https://hub.docker.com/ Docker Hub]上搜索。 | 使用 docker search 命令来搜索镜像,默认从Docker镜像仓库[https://hub.docker.com/ Docker Hub]上搜索。 | ||
<syntaxhighlight lang="bash"> | |||
#搜索nginx软件的镜像 | |||
docker search nginx | docker search nginx | ||
#搜索mysql软件的镜像 | #搜索mysql软件的镜像 | ||
docker search --filter=is-offical=true mysql | docker search --filter=is-offical=true mysql | ||
#搜索star超过100的mysql镜像 | #搜索star超过100的mysql镜像 | ||
docker search --filter=stars=100 mysql</ | docker search --filter=stars=100 mysql | ||
</syntaxhighlight> | |||
输出结果说明: | 输出结果说明: | ||
*NAME: 镜像仓库源的名称 | *NAME: 镜像仓库源的名称 | ||
第151行: | 第173行: | ||
====上传镜像==== | ====上传镜像==== | ||
Docker的官方镜像仓库为[https://hub.docker.com/ Docker Hub],公共仓库为免费,私有仓库需要付费使用。在[https://hub.docker.com/ Docker Hub]上免费注册一个 Docker 账号。接下来可以在终端操作。 | Docker的官方镜像仓库为[https://hub.docker.com/ Docker Hub],公共仓库为免费,私有仓库需要付费使用。在[https://hub.docker.com/ Docker Hub]上免费注册一个 Docker 账号。接下来可以在终端操作。 | ||
<syntaxhighlight lang="bash"> | |||
#登录使用docker login,再输入账号密码 | |||
docker login | docker login | ||
#上传镜像使用docker push,需要登录再使用。username为个人的账户名 | #上传镜像使用docker push,需要登录再使用。username为个人的账户名 | ||
docker push username/ubuntu:18.04 | docker push username/ubuntu:18.04 | ||
#退出使用docker logout | #退出使用docker logout | ||
docker logout</ | docker logout | ||
</syntaxhighlight> | |||
===制作镜像=== | ===制作镜像=== | ||
第172行: | 第191行: | ||
====容器打包为镜像==== | ====容器打包为镜像==== | ||
修改容器,通过命令 docker commit 将容器打包为新镜像。如: | 修改容器,通过命令 docker commit 将容器打包为新镜像。如: | ||
<syntaxhighlight lang="bash"> | |||
#启动一个名称ubuntu-18为容器,并进入容器终端 | |||
docker run --name ubuntu-18 -it ubuntu:18.04 /bin/bash | docker run --name ubuntu-18 -it ubuntu:18.04 /bin/bash | ||
#在容器内修改,如更新软件, | #在容器内修改,如更新软件, | ||
apt-get update | apt-get update | ||
#退出这个容器 | #退出这个容器 | ||
exit | exit | ||
#提交打包镜像 | #提交打包镜像 | ||
docker commit ubuntu-18 ubuntu-updated </ | docker commit ubuntu-18 ubuntu-updated | ||
</syntaxhighlight> | |||
====Dockerfile创建镜像==== | ====Dockerfile创建镜像==== | ||
第306行: | 第330行: | ||
===启动容器=== | ===启动容器=== | ||
启动容器使用docker run,该命令会检查本地是否有镜像,没有就从docker仓库中下载。启动已经停止的容器使用docker start,重启容器为docker restart,如: | 启动容器使用docker run,该命令会检查本地是否有镜像,没有就从docker仓库中下载。启动已经停止的容器使用docker start,重启容器为docker restart,如: | ||
<syntaxhighlight lang="bash"> | |||
#使用 ubuntu 镜像启动一个容器 | |||
docker run -it ubuntu | docker run -it ubuntu | ||
#使用 ubuntu 镜像启动一个容器,并进入终端。要退出容器里的终端输入exit。 | #使用 ubuntu 镜像启动一个容器,并进入终端。要退出容器里的终端输入exit。 | ||
第317行: | 第342行: | ||
#重启一个容器id为dw3342531d3的容器 | #重启一个容器id为dw3342531d3的容器 | ||
docker restart dw3342531d3</ | docker restart dw3342531d3 | ||
</syntaxhighlight> | |||
===查看容器=== | ===查看容器=== | ||
查看本地容器列表使用docker ps命令 | 查看本地容器列表使用docker ps命令 | ||
<syntaxhighlight lang="bash"> | |||
#来查看正在运行的容器 | |||
docker ps | docker ps | ||
#查看所用容器,保存停止的 | #查看所用容器,保存停止的 | ||
docker ps -a</ | docker ps -a | ||
</syntaxhighlight> | |||
使用 docker inspect 命令查看容器底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。 | 使用 docker inspect 命令查看容器底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。 | ||
#查看某个容器配置状态等信息 | #查看某个容器配置状态等信息 | ||
第344行: | 第372行: | ||
*docker attach命令,退出容器终端,容器会停止。 | *docker attach命令,退出容器终端,容器会停止。 | ||
*docker exec命令,退出容器终端,容器不会停止。 | *docker exec命令,退出容器终端,容器不会停止。 | ||
<syntaxhighlight lang="bash"> | |||
#进入一个容器id为dw3342531d3的容器 | |||
docker attach dw3342531d3 | docker attach dw3342531d3 | ||
#进入一个容器id为dw3342531d3的容器 | #进入一个容器id为dw3342531d3的容器 | ||
docker exec -it dw3342531d3 /bin/bash</ | docker exec -it dw3342531d3 /bin/bash | ||
</syntaxhighlight> | |||
===停止容器=== | ===停止容器=== | ||
停止容器使用docker stop,如: | 停止容器使用docker stop,如: | ||
<syntaxhighlight lang="bash"> | |||
docker stop dw3342531d3</ | #停止一个容器id为dw3342531d3的容器 | ||
docker stop dw3342531d3 | |||
</syntaxhighlight> | |||
===删除容器=== | ===删除容器=== | ||
删除容器使用 docker rm 命令。参数-f表示强制删除,可以不用等容器停止后再删除。 | 删除容器使用 docker rm 命令。参数-f表示强制删除,可以不用等容器停止后再删除。 | ||
<syntaxhighlight lang="bash"> | |||
#删除某个容器 | |||
docker rm dw3342531d3 | docker rm dw3342531d3 | ||
#强制删除某个容器 | #强制删除某个容器 | ||
docker rm -f dw3342531d3</ | docker rm -f dw3342531d3 | ||
</syntaxhighlight> | |||
===导出和导入容器=== | ===导出和导入容器=== | ||
第365行: | 第403行: | ||
==仓库(Repository)== | ==仓库(Repository)== | ||
仓库(Repository)是集中存放镜像的地方。 Docker的官方镜像仓库为[https://hub.docker.com/ Docker Hub],公共仓库为免费,私有仓库需要付费使用。 | 仓库(Repository)是集中存放镜像的地方。 Docker的官方镜像仓库为[https://hub.docker.com/ Docker Hub],公共仓库为免费,私有仓库需要付费使用。 | ||
===Docker Hub=== | ===Docker Hub=== | ||
大部分需求都可以通过在Docker Hub中直接下载镜像来实现。在[https://hub.docker.com https://hub.docker.com]免费注册一个 Docker 账号。接下来可以在终端操作 | 大部分需求都可以通过在Docker Hub中直接下载镜像来实现。在[https://hub.docker.com https://hub.docker.com]免费注册一个 Docker 账号。接下来可以在终端操作 | ||
<syntaxhighlight lang="bash"> | |||
#登录使用docker login,再输入账号密码 | |||
docker login | docker login | ||
#在Docker Hub仓库中搜索使用docker search,这命令可以不登录。 | #在Docker Hub仓库中搜索使用docker search,这命令可以不登录。 | ||
docker search ubuntu | docker search ubuntu | ||
#下载镜像使用docker pull,这命令可以不登录。 | #下载镜像使用docker pull,这命令可以不登录。 | ||
docker | docker pull ubuntu | ||
#上传镜像使用docker push,需要登录再使用。username为个人的账户名 | #上传镜像使用docker push,需要登录再使用。username为个人的账户名 | ||
docker push username/ubuntu:18.04 | docker push username/ubuntu:18.04 | ||
#退出使用docker logout | #退出使用docker logout | ||
docker logout</ | docker logout | ||
</syntaxhighlight> | |||
可能出现问题: | 可能出现问题: | ||
*登录时出现:Error saving credentials: error storing credentials - err: exit status 1, out: `Cannot autolaunch D-Bus without X11 $DISPLAY` | *登录时出现:Error saving credentials: error storing credentials - err: exit status 1, out: `Cannot autolaunch D-Bus without X11 $DISPLAY` | ||
第451行: | 第493行: | ||
====Docker安装Flask==== | ====Docker安装Flask==== | ||
[[Flask]]是一个使用[[Python]]编写的轻量级Web应用框架。下面使用Dockerfile生成一个简单flask镜像,并启动。 | [[Flask]]是一个使用[[Python]]编写的轻量级Web应用框架。下面使用Dockerfile生成一个简单flask镜像,并启动。 | ||
<syntaxhighlight lang="bash"> | |||
#创建一个文件夹来保存项目 | |||
mkdir hello_flask | mkdir hello_flask | ||
#利用 cd 命令切换到这个目录 | #利用 cd 命令切换到这个目录 | ||
cd hello_flask </ | cd hello_flask | ||
接下来使用vim app.py命令创建一个app.py文件,内容如下: | </syntaxhighlight>接下来使用vim app.py命令创建一个app.py文件,内容如下: | ||
<syntaxhighlight lang="python"> | |||
from flask import Flask | |||
app = Flask(__name__) | app = Flask(__name__) | ||
第464行: | 第508行: | ||
if __name__=='__main__': | if __name__=='__main__': | ||
app.run(debug=True, host='0.0.0.0') </ | app.run(debug=True, host='0.0.0.0') | ||
然后使用vim Dockerfile命令创建一个Dockerfile文件,内容如下: | </syntaxhighlight>然后使用vim Dockerfile命令创建一个Dockerfile文件,内容如下: | ||
<syntaxhighlight lang="bash"> | |||
app = Flask(__name__) | |||
FROM python:alpine | FROM python:alpine | ||
第476行: | 第521行: | ||
ENTRYPOINT ["python"] | ENTRYPOINT ["python"] | ||
CMD ["app.py"]</ | CMD ["app.py"] | ||
现在hello_flask文件夹下有两个文件app.py和Dockerfile, | </syntaxhighlight>现在hello_flask文件夹下有两个文件app.py和Dockerfile, | ||
<syntaxhighlight lang="bash"> | |||
#在hello_flask文件夹下使用docker build命令生成镜像 | |||
docker build -t flask:1.1.1-min . | docker build -t flask:1.1.1-min . | ||
#使用 docker run 命令运行刚刚创建的镜像: | #使用 docker run 命令运行刚刚创建的镜像: | ||
docker run --name flask -d -p 8080:5000 flask:1.1.1-min</ | docker run --name flask -d -p 8080:5000 flask:1.1.1-min | ||
</syntaxhighlight> | |||
现在在浏览器打开ip;10000,可以看到Hello, World! | 现在在浏览器打开ip;10000,可以看到Hello, World! | ||
第494行: | 第541行: | ||
方法一:利用Docker Hub上现成镜像 | 方法一:利用Docker Hub上现成镜像 | ||
<syntaxhighlight lang="bash"> | |||
#运行mediawiki镜像,没有就从docker hub下载mediawiki再运行 | |||
docker run --name some-mediawiki -p 8080:80 -d mediawiki | docker run --name some-mediawiki -p 8080:80 -d mediawiki | ||
</syntaxhighlight>{{了解更多 | |||
|[https://hub.docker.com/_/mediawiki Docker Hub:Mediawiki ] | |||
}} | |||
==资源== | ==资源== | ||
===官网=== | ===官网=== | ||
* | *Docker 官网:https://www.docker.com | ||
* | *Docker Hub:https://hub.docker.com/ | ||
*Docker 文档:https://docs.docker.com | |||
* | *Docker 文档 > 参考:https://docs.docker.com/reference | ||
* | *Docker 文档 > 示例:https://docs.docker.com/samples | ||
*Docker CE 的 Github:https://github.com/docker/docker-ce | |||
==参考== | ==参考== |
2021年1月8日 (五) 02:05的版本
Docker 是一个容器引擎的开源软件,
简介
时间轴
虚拟机与容器
虚拟机可以在一种操作系统里面运行另一种操作系统,但虚拟机,资源占用多,启动慢。
容器是操作系统层虚拟化,容器化的优势在于占用服务器空间少,通常几秒内即可引导。
Docker 是一种容器的管理方式。下文的容器主要指Docker的容器。
安装
CentOS
官网建议安装在CentOS 7及以上的系统。如果之前有安装docker,先卸载之前版本。三种安装方法:
- 添加Docker源进行安装,安装和升级方便,这是推荐的方法。
- 下载RPM软件包,手动安装。
- 官方一键安装脚本,一些测试和开发用户会选择这种方法。
方法一,添加Docker源进行安装:
#安装所需的软件包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#安装containerd.io软件包,不然会报错requires containerd.io >= 1.2.2-3
sudo yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm
#设置官网的稳定版仓库源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#可选,体验版和测试版默认是关闭的,可以通过命令打开,详细见文档。
#安装最新版本的docker CE
sudo yum install docker-ce
#启动守护进程
sudo systemctl start docker
也可以使用dnf命令安装,dnf为下一代yum命令。
sudo dnf -y install dnf-plugins-core
sudo dnf install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install docker-ce
sudo systemctl start docker
方法二,下载RPM包,离线安装:
#在联网的计算机下载RPM软件包,从官网地址选一个版本下载:https://download.docker.com/linux/fedora/
#比如:docker-ce-cli-19.03.4-3.fc31.x86_64.rpm
#复制到计算机的某个目录,执行安装
sudo dnf -y install docker-ce-cli-19.03.4-3.fc31.x86_64.rpm
#启动守护进程
sudo systemctl start docker
方法三,使用脚本安装: Docker提供脚本安装方式,快捷安装。
#下载脚本
curl -fsSL https://get.docker.com -o get-docker.sh
#运行脚本安装
sudo sh get-docker.sh
#如果以非root用户使用docker(推荐), 需要添加一个用户到'docker'用户组中
#查看是否添加成功,如果添加当前登录的用户,需要重新登录,组权限才会生效。
sudo usermod -aG docker your-user-name
#查看是否安装成功
docker --version
了解更多 >> Docker文档-centos安装Docker引擎
Ubuntu
Ubuntu安装Docker也有三种方法,与CentOS安装docker类似。
方法一,添加Docker源进行安装:
#获取apt可用最新列表
sudo apt-get update
#使用apt安装下列软件包
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
#添加docker官方GPG密钥,验证密钥指纹9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
#添加docker的稳定源
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
#获取apt可用最新列表
sudo apt-get update
#安装最新版的Docker CE
sudo apt-get install docker-ce docker-ce-cli containerd.io
#检验是否安装成功
sudo docker run hello-world
#使用非root用户使用docker,可以将用户添加到docker组:
sudo gpasswd -a ${USER} docker #将当前用户添加到docker组,重新登录后生效
sudo usermod -aG docker your-user #将其他用户添加到docker组
了解更多 >> Docker文档-Ubuntu安装Docker CE
镜像(Image)
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。
镜像使用
查看本地镜像
可以使用 docker images 来列出本地主机上的镜像。
docker images docker image ls
输出结果说明:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
删除镜像
删除镜像文件使用docker image rm
命令或docker rmi
,如
docker image rm Ubuntu docker rmi Ubuntu
下载镜像
下载镜像,使用docker pull命令,默认从Docker镜像仓库Docker Hub上下载。
#默认下载tag: latest的版本,
docker pull ubuntu
#指定镜像版本
docker pull ubuntu:18.04
仓库搜索镜像
使用 docker search 命令来搜索镜像,默认从Docker镜像仓库Docker Hub上搜索。
#搜索nginx软件的镜像
docker search nginx
#搜索mysql软件的镜像
docker search --filter=is-offical=true mysql
#搜索star超过100的mysql镜像
docker search --filter=stars=100 mysql
输出结果说明:
- NAME: 镜像仓库源的名称
- DESCRIPTION: 镜像的描述
- OFFICIAL: 是否docker官方发布
- START: 表示点赞数量
- AUTOMATED: 自动构建
在命令行输入 docker search --help,可以查看docker search的帮助
上传镜像
Docker的官方镜像仓库为Docker Hub,公共仓库为免费,私有仓库需要付费使用。在Docker Hub上免费注册一个 Docker 账号。接下来可以在终端操作。
#登录使用docker login,再输入账号密码
docker login
#上传镜像使用docker push,需要登录再使用。username为个人的账户名
docker push username/ubuntu:18.04
#退出使用docker logout
docker logout
制作镜像
当docker镜像仓库没有想要的镜像,可以通过以下两种方式制作镜像。
- 在已有容器中修改,再提交保存为新镜像。
- 使用Dockerfile文件,从头创建一个新的镜像。
容器打包为镜像
修改容器,通过命令 docker commit 将容器打包为新镜像。如:
#启动一个名称ubuntu-18为容器,并进入容器终端
docker run --name ubuntu-18 -it ubuntu:18.04 /bin/bash
#在容器内修改,如更新软件,
apt-get update
#退出这个容器
exit
#提交打包镜像
docker commit ubuntu-18 ubuntu-updated
Dockerfile创建镜像
Docker可以自动读取Dockerfile文件里的指令生成一个镜像。Dockerfile是一个文本文件,都是一些关于组装镜像的指令。通过docker build命令来生成一个镜像。
Dockerfile语法
Dockerfile文件格式如下:
# Comment 注释 INSTRUCTION arguments
注释使用#号,指令不区分大小写,但一般指令使用大写,这样容易和后面参数区分开来。
Dockerfile指令
指令 | 格式 | 描述 | 示例 |
---|---|---|---|
FROM | FROM [--platform=<platform>] <image>[:<tag>] [AS <name>] | 初始化,设置基准镜像。这个指令必须放开头。 | FROM debian:buster-slim |
RUN | RUN <command> 或 RUN ["executable", "param1", "param2"] | 执行命令 | RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME' |
CMD | CMD ["param1","param2"] CMD command param1 param2 CMD ["executable","param1","param2"] |
容器启动时执行的命令。该指令只能有一个,当有多个RUN指令只会执行最后一个 | |
LABEL | LABEL <key>=<value> <key>=<value> <key>=<value> ... | 给镜像添加元数据。如添加一些作者信息,版本信息等。可以使用docker image inspect命令查看镜像所有信息,包括标签。 | LABEL maintainer="yourname@domain.com" version="1.0" |
EXPOSE | EXPOSE <port> [<port>/<protocol>...] | 开放容器某个端口,默认协议为TCP。运行主机可以通过docker run命令增加-p参数来对接这个端口。 | EXPOSE 80/udp |
ENV | ENV <key> <value> ENV <key>=<value> ... |
设置环境变量 | ENV myName John Doe |
ADD | ADD [--chown=<user>:<group>] <src>... <dest> ADD [--chown=<user>:<group>] ["<src>",... "<dest>"] |
复制文件、目录或URLs到镜像中。src的路径支持Go语言的filepath.Match规则。 | ADD test.txt /etc/test/ 拷贝主机的test.txt文件到镜像/etc/test/目录中 |
COPY | COPY [--chown=<user>:<group>] <src>... <dest> COPY [--chown=<user>:<group>] ["<src>",... "<dest>"] |
复制文件或目录到镜像中。src的路径支持Go语言的filepath.Match规则。 | COPY test.txt /etc/test/ 拷贝主机的test.txt文件到镜像/etc/test/目录中 |
ENTRYPOINT | ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2 |
容器启动时执行的命令。 | ENTRYPOINT ["top", "-b"] |
VOLUME | VOLUME ["/data"] | 创建挂载点 | VOLUME /myvol |
USER | USER <user>[:<group>] USER <UID>[:<GID>] |
设置启动容器的用户,可以是用户名或UID。 | USER username |
WORKDIR | WORKDIR /path/to/workdir | 设置工作目录,对RUN, CMD, ENTRYPOINT, COPY 和 ADD指令有效。 | WORKDIR /home/foo/work |
ARG | ARG <name>[=<default value>] | 设置构建镜像时变量,构建docker build时使用--build-arg <varname>=<value>传递变量值。 | ARG user1=someuser |
ONBUILD | ONBUILD <INSTRUCTION> | 设置触发指令,当该镜像作为基准镜像,构建时执行。 | |
STOPSIGNAL | STOPSIGNAL signal | ||
HEALTHCHECK | HEALTHCHECK [OPTIONS] CMD command HEALTHCHECK NONE |
告诉dockers该镜像的容器正常工作状况 | HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit 1 |
SHELL |
docker build构建镜像
了解更多 >> Docker参考:Dockerfile
基础镜像
Alpine Linux是一个面向安全的轻型的Linux发行版。使用Docker创建容器时,基础镜像通常选择Ubuntu或Centos,不管哪个镜像的大小都在100MB以上。而Alpine仅仅只有5MB。
Alpine不包含 bash 因此进入某个alpine docker容器,可以使用sh命令,如:
docker exec -it container_name sh
了解更多 >> Docker Hub:Alpine Alpine官网
容器(Container)
启动容器
启动容器使用docker run,该命令会检查本地是否有镜像,没有就从docker仓库中下载。启动已经停止的容器使用docker start,重启容器为docker restart,如:
#使用 ubuntu 镜像启动一个容器
docker run -it ubuntu
#使用 ubuntu 镜像启动一个容器,并进入终端。要退出容器里的终端输入exit。
docker run -it ubuntu /bin/bash
#使用ubuntu镜像启动一个名称ubuntu-test为容器,并后台运行。参数-d表示后台运行。
docker run -itd --name ubuntu-test ubuntu /bin/bash
#启动一个容器id为dw3342531d3的容器
docker start dw3342531d3
#重启一个容器id为dw3342531d3的容器
docker restart dw3342531d3
查看容器
查看本地容器列表使用docker ps命令
#来查看正在运行的容器
docker ps
#查看所用容器,保存停止的
docker ps -a
使用 docker inspect 命令查看容器底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
#查看某个容器配置状态等信息 docker inspect dw3342531d3
查看容器日志,使用docker logs命令。可以查看容器内部的标准输出。
#查看某个容器内部的标准输出 docker logs dw3342531d3
使用 docker top 来查看容器内部运行的进程
#查看某个容器内部的标准输出 docker top dw3342531d3 docker top static_web
进入容器
进入容器可以使用下面两个命令:
- docker attach命令,退出容器终端,容器会停止。
- docker exec命令,退出容器终端,容器不会停止。
#进入一个容器id为dw3342531d3的容器
docker attach dw3342531d3
#进入一个容器id为dw3342531d3的容器
docker exec -it dw3342531d3 /bin/bash
停止容器
停止容器使用docker stop,如:
#停止一个容器id为dw3342531d3的容器
docker stop dw3342531d3
删除容器
删除容器使用 docker rm 命令。参数-f表示强制删除,可以不用等容器停止后再删除。
#删除某个容器
docker rm dw3342531d3
#强制删除某个容器
docker rm -f dw3342531d3
导出和导入容器
仓库(Repository)
仓库(Repository)是集中存放镜像的地方。 Docker的官方镜像仓库为Docker Hub,公共仓库为免费,私有仓库需要付费使用。
Docker Hub
大部分需求都可以通过在Docker Hub中直接下载镜像来实现。在https://hub.docker.com免费注册一个 Docker 账号。接下来可以在终端操作
#登录使用docker login,再输入账号密码
docker login
#在Docker Hub仓库中搜索使用docker search,这命令可以不登录。
docker search ubuntu
#下载镜像使用docker pull,这命令可以不登录。
docker pull ubuntu
#上传镜像使用docker push,需要登录再使用。username为个人的账户名
docker push username/ubuntu:18.04
#退出使用docker logout
docker logout
可能出现问题:
- 登录时出现:Error saving credentials: error storing credentials - err: exit status 1, out: `Cannot autolaunch D-Bus without X11 $DISPLAY`
执行下面命令即可:sudo apt install gnupg2 pass
- docker push报错:denied: requested access to the resource is denied
镜像名和用户名不匹配,使用tag将镜像名改为username/镜像名,username为个人的用户名,然后再推送,如:
docker tag ubuntu:18.04 username/ubuntu:18.04 docker push username/ubuntu:18.04
国内的镜像仓库
搭建私有镜像仓库
网络
了解更多 >> Docker 文档:网络概览
网络类型
Docker的网络是可拔插的子系统,使用驱动程序。docker内置了几个驱动程序,提供了核心网络功能。
bridge
bridge是默认的网络驱动,当没有指定网络驱动,会默认使用这种网络类型。
host
overlay
macvlan
none
网络插件
数据管理
默认情况下,所有文件将会存储在容器里的可写的容器层(container layer)。意味着:
- 数据与容器为一体。当容器删除时,数据会一起被删除。
- 该容器与其他程序(容器)数据交换难。
- 由于容器的写入层是与宿主机器紧紧耦合,所以难以移动数据到其他机器。
- 容器的写入层的是通过 存储驱动(storage driver) 管理文件系统。存储驱动会使用Linux内核的 链合文件系统(union filesystem)进行挂载。相比起直接操作于宿主机器文件系统的 数据卷(data volumes),这额外的抽象层将会降低性能。
Docker提供两种将数据存储在宿主机的方法:卷(volumes)和 绑定挂载(bind mounts)。另外,Linux用户还可使用 tmpfs 进行挂载;window用户还可以使用 命名管道(named pipe)。
了解更多 >> Docker 文档:Docker上管理数据
卷(volumes)
绑定挂载(bind mounts)
进阶教程
Docker Compose
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用YML文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从YML文件配置中创建并启动所有服务。
了解更多 >> Docker文档-Compose
Swarm mode
Swarm mode是Docker集群管理工具,从Docker1.2开始Docker Swarm内置到Docker中为Swarm mode。
了解更多 >> Docker文档-Swarm mode
安全
实例
Docker安装Nginx
Docker安装Flask
Flask是一个使用Python编写的轻量级Web应用框架。下面使用Dockerfile生成一个简单flask镜像,并启动。
#创建一个文件夹来保存项目
mkdir hello_flask
#利用 cd 命令切换到这个目录
cd hello_flask
接下来使用vim app.py命令创建一个app.py文件,内容如下:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__=='__main__':
app.run(debug=True, host='0.0.0.0')
然后使用vim Dockerfile命令创建一个Dockerfile文件,内容如下:
app = Flask(__name__)
FROM python:alpine
COPY . /app
WORKDIR /app
RUN pip install Flask
ENTRYPOINT ["python"]
CMD ["app.py"]
现在hello_flask文件夹下有两个文件app.py和Dockerfile,
#在hello_flask文件夹下使用docker build命令生成镜像
docker build -t flask:1.1.1-min .
#使用 docker run 命令运行刚刚创建的镜像:
docker run --name flask -d -p 8080:5000 flask:1.1.1-min
现在在浏览器打开ip;10000,可以看到Hello, World!
可以使用-v命令,把当前路径挂载到容器的/app目录,$PWD表示当前目录,比如现在的hello_flask。
docker run --name flask2 -d -p 8080:5000 -v $PWD:/app flask:1.1.1-min
在浏览器打开ip:8080可以看到“Hello, World!”,挂载后在主机中的hello_flask修改app.py,刷新网页就会看到更新的内容。修改文件时候要使用root权限不然会报错,sudo vim app.py
Docker安装Mediawiki
Mediawiki全球最著名的开源wiki程序,维基百科也使用该软件。
方法一:利用Docker Hub上现成镜像
#运行mediawiki镜像,没有就从docker hub下载mediawiki再运行
docker run --name some-mediawiki -p 8080:80 -d mediawiki
了解更多 >> Docker Hub:Mediawiki
资源
官网
- Docker 官网:https://www.docker.com
- Docker Hub:https://hub.docker.com/
- Docker 文档:https://docs.docker.com
- Docker 文档 > 参考:https://docs.docker.com/reference
- Docker 文档 > 示例:https://docs.docker.com/samples
- Docker CE 的 Github:https://github.com/docker/docker-ce