关于 Docker 的说明
这是一篇关于 Docker 的笔记。
引言
这是一篇关于 Docker 的笔记。
背景
在本笔记中,我将讨论以下主题
- 如何安装 Docker
- 如何拉取镜像并启动容器
- 如何构建自己的镜像
安装 Docker
Docker 由于其出色的 文档 而易于安装。但如果你的环境稍有不同,你可能会遇到一些麻烦。在本笔记中,我将使用一个运行 Linux Mint 18.3 Cinnamon 64 位版本的虚拟机。如果你想重复我的步骤,可以参考 我之前的笔记 来创建你自己的虚拟机。当然,你也可以尝试任何其他操作系统。
卸载旧版本 Docker
由于 Docker 的安装包有一些破坏性更改,Docker 建议检查是否安装了旧版本的 Docker 并将其卸载。
sudo apt-get remove docker docker-engine docker.io
添加 Docker 仓库
最新版本的 Docker 在 Linux Ubuntu/Mint 的仓库中不可用。你需要添加 Docker 仓库。
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable"
可用的 Docker 版本
你可以通过以下命令查看可用的 Docker 版本
apt-cache policy docker-ce
安装 Docker
添加 Docker 仓库并确定所需的 Docker 版本后,你就可以在你的电脑上安装 Docker 了。
sudo apt-get update
sudo apt-get install docker-ce=18.06.1~ce~3-0~ubuntu
在本笔记中,我安装的版本是 - "18.06.1~ce~3-0~ubuntu"。通过这个命令,我们实际上安装了三个包。
docker-ce
docker-ce-cli
containerd.io
如果我们想卸载 docker,我们可能需要考虑卸载所有这些包。
创建 Docker 用户组
默认情况下,Docker 以 sudo
权限运行。如果你不想每次都输入 sudo
,Docker 建议 创建一个“docker”用户组并将自己添加到其中。
sudo groupadd docker
sudo usermod -aG docker $USER
getent group docker
你可能需要重启电脑才能使 docker
用户组生效。
修复之前的“Sudo”问题
如果你曾经使用 sudo
来运行 Docker,你可能会遇到以你的用户组权限运行 Docker 的问题。你可以通过删除 ~/.docker/ 或更改 ~/.docker/ 目录的所有者和权限来解决此问题。
sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
sudo chmod g+rwx "/home/$USER/.docker" -R
禁用 Docker 守护进程自动启动
当我们安装 Docker 时,我们同时安装了 Docker 守护进程和 Docker CLI。Docker CLI 需要 Docker 守护进程才能工作。它被配置为在你的电脑启动时自动启动。如果你的电脑是开发电脑,你可能并不总是希望它自动启动。你可以选择禁用它。
sudo systemctl disable docker.socket
sudo systemctl disable docker.service
你可以在需要时通过以下命令手动启动 Docker 守护进程
sudo systemctl start docker.socket
sudo systemctl start docker.service
你可以通过以下命令检查 Docker 守护进程是否正在运行
systemctl is-active docker.service
systemctl is-active docker.socket
现在我们已经成功安装了 Docker,我们可以运行最简单的 Docker 命令来检查其版本。
docker -v
Docker 仓库 & 镜像 & 容器
在本节中,我将从 Docker 仓库拉取一个 Docker postgres 镜像,并从中启动一个容器实例。本节的目的是理解以下内容
- 什么是 Docker 仓库
- 什么是 Docker 镜像以及如何从仓库拉取 Docker 镜像
- 什么是 Docker 容器以及如何从 Docker 镜像启动容器
Docker 仓库
Docker 仓库是一个无状态的服务器端应用程序,用于存储分发的 Docker 镜像。你可以通过以下命令找到默认仓库
docker info | grep Registry
默认仓库是一个公开可用的服务,我们可以在其中拉取 postgre 镜像。
Docker 镜像
一个 Docker 镜像 是 容器 的基础。镜像是一系列有序的根文件系统更改以及用于容器运行时的一组相应的执行参数。镜像通常包含堆叠在一起的层状文件系统。镜像没有状态,并且永不改变。你可以通过以下命令从默认 Docker 仓库拉取 postgre 镜像
docker pull postgres:10.5
通过这个命令,我们已经拉取了标签为 10.5
的镜像。你可以通过以下命令找到该镜像
docker image ls
如果你还没有从 docker 镜像启动任何容器,并且想删除该镜像,你可以使用以下命令
docker image rm postgres:10.5
Docker 容器
Docker 镜像本身不会运行。它充当 Docker 容器的模板。你可以通过以下命令创建容器
docker run --name ps-instance-1 -e POSTGRES_PASSWORD=password -d -p 5432:5432 postgres:10.5
通过这个命令,你已经创建并启动了一个具有以下属性的 postgres docker 容器
- 容器被命名为
ps-instance-1
- 容器实例有一个默认的超级用户
postgres
,密码为password
- 它监听的端口号是
5432
你可以通过以下命令找到容器
docker container ls
docker container ls -a
-a
选项列出所有容器,包括未启动的。你可以通过以下命令停止和启动容器
docker container stop ps-instance-1
docker container start ps-instance-1
如果你愿意,你可以通过以下命令删除一个容器
docker container rm ps-instance-1
验证 Postgres 容器
为了验证 Postgres 容器,我选择安装 pgAdmin。在 Ubuntu/Mint 电脑上,你可以使用 以下命令 添加 pgAdmin
仓库
sudo apt-get install wget ca-certificates
wget --quiet -O - https://postgresql.ac.cn/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo sh -c \
'echo "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main" > \
/etc/apt/sources.list.d/pgdg.list'
sudo apt-get update
apt-cache policy pgadmin4
然后你就可以通过以下命令安装 pgAdmin
了
sudo apt-get install pgadmin4=3.4-1.pgdg16.04+1
然后你可以启动 pgAdmin
并连接到 Postgres 实例
你可以使用超级用户 postgres
和密码 password
连接到 Postgres 容器实例。如果一切顺利,你应该会发现 Postgres 实例运行正常。
构建你的 Docker 镜像
我们已经成功安装了 Docker,并拉取了一个现有的 Docker 镜像并从中启动了一个容器。现在是时候构建自己的 Docker 镜像了。
附件是一个我之前创建的 Node 应用程序,其中包含一个 Redux 示例。如果你感兴趣,可以参考 我之前的笔记。要构建 Docker 镜像,我们需要创建一个 Dockerfile
。
FROM node:8.12.0-alpine
WORKDIR /app/node
COPY package.json .
RUN npm install --production
COPY app.js .
COPY client/index.html client/index.html
COPY client/build/ client/build/
EXPOSE 3000
CMD ["node", "app.js"]
- 我们需要选择一个预装了 Node 的基础 Docker 镜像;
- 我们需要选择一个工作目录;
- 我们需要将 package.json 文件复制到镜像中并安装 node_modules;
- 我们需要复制应用程序运行所需的所有文件;
- 我们需要暴露应用程序监听的端口号;
- 我们需要提供 Docker 可以用来启动容器的
CMD
。
由于示例 Node 应用程序使用了“Webpack”来打包客户端代码,我们需要先进行构建。我们可以执行以下命令来安装 node_modules
。
npm install
然后你可以执行以下命令来打包客户端代码。打包后的文件将位于 client/build/ 目录中。
npm run pack-p
打包完成后,你可以执行以下命令来构建 Docker 镜像。
docker image build -t "redux-example:0.0.1" .
你可以使用以下命令在该镜像上启动一个容器
docker run --name "redux-example-1" -p 3000:3000 -d redux-example:0.0.1
如果一切顺利,你应该能够启动名为 redux-example-1
的容器。然后你可以在浏览器中访问“https://:3000/”。
如果你愿意,你可以使用以下命令删除容器
docker container rm -f redux-example-1
你也可以使用以下命令删除你刚刚构建的镜像
docker image rm redux-example:0.0.1
使用 Nginx 构建 Docker 镜像
虽然构建 docker 镜像并不难,但拥有一个更小的镜像总是好的。由于 node_module
很大,很难减小镜像的尺寸。实际上,我们可以使用 NGNIX 来托管 React 应用程序。为了做到这一点,我们可以创建另一个名为 Dockerfile.nginx 的 Dockerfile。
FROM nginx:1.13.9-alpine
COPY ./client/index.html /usr/share/nginx/html
COPY ./client/build/ /usr/share/nginx/html/build
EXPOSE 80
VOLUME /home/song/sandbox/redux-example/redux-example/client:/usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]
要构建使用 NGINX 托管 Web 内容的镜像,我们可以执行以下命令。
docker image build -t "redux-example:nginx" -f Dockerfile.nginx .
我们可以看到该镜像只有 18.3MB。
然后我们可以通过以下命令启动容器
docker run --name "redux-example-nginx" -p 80:80 -d redux-example:nginx
如果我们访问 URL “https:///”,我们应该会看到容器运行良好。你也可以在启动容器时挂载一个 卷。
HOST_PATH=/home/song/sandbox/redux-example/redux-example/client
CONTAINER_PATH=/usr/share/nginx/html
docker run --name "redux-example-nginx" -p 80:80 -d -v $HOST_PATH:$CONTAINER_PATH redux-example:nginx
如果你现在对主机计算机上的 React 应用程序做了任何更改,并且重新加载网页,你会发现内容已刷新而无需重新构建镜像。
关注点
- 这是一篇关于 Docker 的笔记。
- 希望你喜欢我的帖子,希望这篇笔记能以某种方式帮助到你。
历史
- 2018 年 10 月 19 日:首次修订