发布于

Docker 常用命令及使用 Portainer 可视化管理

作者
  • 姓名
    Twitter

Docker 环境安装

在 Ubuntu 中安装 Docker

  • 使用 snap 安装

只需要在命令行中输入 snap install docker, 稍等片刻即可完成安装。

docker-nextcloud1.png

  • 使用 apt-get 安装
sudo apt-get update
sudo apt-get install docker.io

使用 Portainer 进行 Docker 可视化管理

本文面向的是 Docker 的初级使用者,所以我非常推荐使用 Portainer 这样的图形化 Docker 管理器,在完成相关服务搭建后关闭即可,当然所有通过 Portainer完成的操作都可以通过命令行完成。

安装方式如下:

  • 创建 Portainer数据卷
docker volume create portainer_data
  • 运行 Portainer 容器
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data --name portainer portainer/portainer

待服务器拉取镜像完成,Portainer就安装成功了,绑定的端口是9000,可以通过服务器IP:9000进行访问:

docker-nextcloud-portainer1.png

首次访问需要创建初始用户,创建之后选择 Local 连接:

docker-nextcloud-portainer2.png

Portainer 的界面比较美观,对新手而言功能足够强大:

docker-nextcloud-portainer3.png

部分 Docker 的基本操作

本部分内容主要针对 Docker 系列文章所使用到的操作进行说明,并不打算详细说明,有兴趣的朋友可以查看文末的相关内容链接学习,以下是本文涉及到的全部命令。

运行容器

docker run

我们常使用的参数主要包括以下几个: -d 后台运行容器 -P 自动映射端口 -p xxxx:xxxx 手动映射端口 -v 绑定volume或者主机文件夹到容器 --name abcd. 给容器命名,若省略则随机生成容器名

查看容器状态

docker ps

直接运行时显示正在运行的容器,使用参数-a则显示所有容器

启动停止重启容器

docker start 容器名 docker stop 容器名 docker restart 容器名

容器名可以使用 docker ps -a 获得。

删除容器

docker rm 容器名

注意在删除容器之前,须先停止容器

复制容器内文件

docker cp 容器名:容器内路径 复制目标位置

所有操作既可以使用命令行,也可以使用 Portainer 图形化操作,除 docker rundocker cp之外,推荐刚开始时其他操作全部使用 Portainer,待熟练之后可以关闭该工具使用命令行管理。

使用 Docker 镜像搭建服务的一般方法

使用 Docker 搭建网络应用,最方便快捷的方式无疑是直接使用现成的 Docker 镜像了,一行 docker run 命令,一个服务就开始运行,不需要时直接删除,干干净净。

体验新应用的时候这样可以,但如果真的要长期使用这项服务,只 docker run 一下还是不够的,我们要考虑:

  • 需要将容器端口映射到主机端口,方便端口转发
  • 需要将用户数据和配置文件从容器暴露,方便应用升级和应用配置

端口的问题容易解决,只需要将容器端口映射到某个外部端口,避免每次容器重启绑定的端口变化即可,所以最关键的问题便是搞清楚,容器运行时的用户数据和配置文件位置,然后通过 volume 存储或者直接 bind 主机文件。

基于以上考虑,使用第三方构建的镜像时,一般步骤如下:

  • 从 Docker Hub 或者其他类似服务找到所需的镜像文件
  • 使用 docker run 命令测试是否能够在我们的服务器环境上正常运行
  • 通过容器相关文档或容器运行生成的 volume 判断需要将哪些数据持久存储
  • 对需要持久存储的数据选择使用 volume 或者 bind 方式
  • 如果使用 bind 方式,从已经正常运行的容器中使用 docker cp 命令将初使内容复制到主机中或者在主机中新建相应空文件夹(如果是配置文件必须使用 docker cp 复制,否则很多服务无法正常运行)
  • 使用 docker run 命令的 -p 参数绑定端口 -v 绑定卷或文件夹,再次运行容器
  • 若服务无法正常运行,查看 Log 并针对报错内容进行修改

我们以nginx为例进行说明:

我们直接运行 Docker Hub 上的 nginx 官方镜像:

docker run -d -P nginx

然后使用 docker ps 查看到 nginx 已经运行了

docker-nextcloud-example2.png

Docker 自动分配将容器的80端口映射到了主机的32768端口,此时我们访问服务器IP:32768就能看到 nginx服务已经正常运行了

docker-nextcloud-example3.png

下面我们要做的主要工作就是找到需要持久存储的文件,最明显的就是网站主目录以及配置文件,通过查看 Docker Hub 的 nginx 官方页面,可以知道镜像内部 网站主目录为 /usr/share/nginx/html ,配置文件目录为 /etc/nginx ,我们需要将这两个文件夹绑定到主机。

为方便管理,对 Docker 中容器的相关的配置文件建议统一存放

由于本文使用的是root用户,下文所有~均指/root

  • 新建 Docker 相关文件的存储目录
mkdir ~/docker
  • 从 Docker nginx 容器中复制初始配置文件:
docker cp nginx-name:/etc/nginx ~/docker

注意这里的 nginx-name 指的是 nginx 容器的名字,因为我们未使用 --name 来指定名称,因此容器的名字会是 Docker 随机生成的,我们通过 docker ps 获得。

docker-nextcloud-example4.png

  • 新建网站主目录
mkdir ~/wwwroot

现在我们要做就是删除原容器,并再次运行,但这一次进行端口映射和目录绑定,使用命令行的话,内容如下,这次我们使用了--name来命名

docker run -d --name nginx \
-v /root/docker/nginx:/etc/nginx \
-v /root/wwwroot:/usr/share/nginx/html \
-p 80:80 \
-p 443:443 \
nginx

容器顺利运行,由于我们直接将容器80端口映射到了主机80端口,此时直接访问http://服务器IP 即可

不过由于目前我们的网站主目录是空的,打开 http://服务器IP 会出现403错误,我们在网站主目录下新建一个index.html文件,并输入 Hello World!

touch ~/wwwroot/index.html
echo 'Hello World!' > ~/wwwroot/index.html

刷新一下页面,就可以看到正常显示 Hello World!

至此,一个 nginx 服务就通过 Docker 正常运行了,我们可以修改 nignx配置,也可以修改网站内容,即使容器删除,再次新建容器后绑定文件夹后又一切照旧。

我们可以根据我们的需要绑定更多目录,或者将容器内的某些文件使用 volume 进行存储,最常用的就是增加 SSL 证书目录的绑定以配置 HTTPS 访问。