0%

docker 快速使用

前言

docker 非常的简单,在目标软件需要庞大的依赖的时候,我们只需要使用官方或者第三方打包好的镜像即可快速安装软件,当然也是有代价的,资源占用稍微多一点,不过比起花费大量的时间和知识起一套环境是值得的。

本次演示将在 debian9 和树莓派上进行。

docker arm 版在镜像上是有缺失的,因为所有软件的基础镜像必须基于 arm 构建,而有的镜像没有 arm 构架,比如 Fedora 。

还有就是不建议在低性能 vps 上进行安装,配置至少 双核 cpu 2g 内存 20g储存,不然使用的时候会比较不爽。

安装 docker

安装 docker 其实官方文档已经写的很好了,只是关于树莓派这就是 arm 写得不是很清楚。

这是官方的安装文档地址 https://docs.docker.com/install/linux/docker-ce/debian/

** 使用官方脚本安装 docker **
使用一键脚本应该是最简单的安装方式了。
docker 官方提供了安装脚本,理论上适用于所有的 linux 发行版。这里我只在树莓派上测试过。因为我个人不是很喜欢使用一键脚本,所以也没有进行更多的测试。

脚本方式安装 docker

curl -fsSL get.docker.com -o get-docker.sh && sudo sh get-docker.sh

登它自己跑,跑完就安装成功了打印信息如下

pi@raspberrypi:~ $ curl -fsSL https://get.docker.com -o get-docker.sh
pi@raspberrypi:~ $ sudo sh get-docker.sh
# Executing docker install script, commit: 4957679
+ sh -c apt-get update -qq >/dev/null
+ sh -c apt-get install -y -qq apt-transport-https ca-certificates curl >/dev/null
+ sh -c curl -fsSL "https://download.docker.com/linux/raspbian/gpg" | apt-key add -qq - >/dev/null
Warning: apt-key output should not be parsed (stdout is not a terminal)
+ sh -c echo "deb [arch=armhf] https://download.docker.com/linux/raspbian stretch edge" > /etc/apt/sources.list.d/docker.list
+ sh -c apt-get update -qq >/dev/null
+ sh -c apt-get install -y -qq --no-install-recommends docker-ce >/dev/null
+ sh -c docker version
Client:
 Version:           18.09.0
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        4d60db4
 Built:             Wed Nov  7 00:57:21 2018
 OS/Arch:           linux/arm
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.0
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       4d60db4
  Built:            Wed Nov  7 00:17:57 2018
  OS/Arch:          linux/arm
  Experimental:     false
If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:

  sudo usermod -aG docker your-user

Remember that you will have to log out and back in for this to take effect!

WARNING: Adding a user to the "docker" group will grant the ability to run
         containers which can be used to obtain root privileges on the
         docker host.
         Refer to https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
         for more information.

然后将当前用户添加进 docker 组

sudo usermod -aG docker $USER

然后退出终端重新连接一下就可以了。

** debain 安装 docker **

docker debian 源有打包,但是不建议使用 debian 官方源进行安装因为版本太老了。我们需要添加 docker 官方源进行安装

更新源

sudo apt update

安装 docker 源会用到的组件

sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common

添加 docker 源的 gpg 密匙

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

添加 docker 源

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"

再次更新一下源

sudo apt update

安装 docker

sudo apt install docker-ce

将当前用户放入 docker 组,如果不添加的话执行 docker 命令时需要 sudo 感觉非常的麻烦

sudo usermod -aG docker $USER

然后关闭终端 重新连接一下就能使用了

** 树莓派安装 docker **

关于树莓派 官方建议使用 shell 脚本进行安装,而我不接受它的建议,而且官方有提供 arm 的 docker 源。

树莓派的安装方式和 debian 基本相同,只是添加的储存库不同

更新软件源

sudo apt update

安装添加 docker 官方源会用到的软件

sudo apt install gnupg2

添加 gpg 密匙

curl -fsSL https://download.docker.com/linux/raspbian/gpg | sudo apt-key add -

添加 docker 储存库 docker.list,曾经是可以使用 add-apt-repository 进行添加的,但是在写下本教程时尝试失败所以改用这种方式添加,命令行中的 stretch 可以换为你当前的版本代号

echo "deb [arch=armhf] https://download.docker.com/linux/raspbian stretch stable" |sudo tee /etc/apt/sources.list.d/docker.list

然后再更新一下软件源

sudo apt update

安装 docker

sudo apt install docker-ce

添加当前用户进入 docker 组

sudo usermod -aG docker $USER

然后关闭终端重新连接一下,如果你使用的是桌面环境建议退出登录然后重新登录或者重启一下

测试 docker

当上面得 安装步骤完成后,我们还需要测试一下 docker 是否能正常运行。docker 官方贴心的准备了 名为 hello-woeld 的镜像用来测试

运行以下内容进行测试

docker run hello-woeld

不出意外的话你的屏幕上应该会打印以下内容如果报错,那就检查一下安装步骤是否正确

pi@raspberrypi:~ $ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1eda109e4da: Pull complete 
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm32v7)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

pi@raspberrypi:~ $

docker 简单使用

当上面的步骤进行完后就可以开始使用了。如果只是简单的使用它的话,那学习一些基础的知识就够用了。接下来我会稍微讲解一下 docker 的参数,记住这些参数就能愉快的玩耍了。

** 下载镜像 **

docker pull 镜像名,比如 docker pull ubuntu 镜像名后边可以跟版本号像这样 docker pull ubuntu:18.04 这样就会把 ubuntu 镜像拉取到本地,不过这个参数一般用处不大因为 `docker run 会自动 pull。

** 运行镜像 **

docker run 控制条件 镜像名 可选参数 运行镜像,如果镜像不存在则进行下载。 docker run 有几个控制条件经常用到需要记一下 。关于可选参数看镜像作者有没有做一些定制如果没有我们就自己指定了

-it 以交互式终端运行容器实际上 -i-t 是两个参数一般合并使用 比如 docker run -it ubuntu bash 以交互式终端启动 docker 镜像并指定 ubuntu 镜像运行后的指定程序,这里我指定的 bash

--rm 运行后删除此镜像,运行期间产生的数据,这个数据一般来说没什么用,如果实在需要的话可以通过 --name 重命名一下方便使用。 --rm的使用方式类似于这样 docker run -it --rm ubuntu bash

-p 从字面意思可以理解为 post ,端口映射参数。如果容器内部的服务需要通过网络访问的话我们就需要使用这个参数将容器内部的端口映射出来了,使用 -p 时并不要求容器内的端口在监听状态,也就是说我们可以先将端口映射进去在说,还有就是容器内的端口可以和宿主机使用同一个端口,不会冲突的,请放心映射 。例如 : docker run -p 8080:80 nginx 将宿主机 8080 映射到容器内的 80 端口。直接访问 宿主机 ip 8080 就能访问容器了

-h 注意哦 -h 不是 help 的意思而是 hostname 的意思,这个参数一般不常用,可以用来指定 docker 容器内的 hostname ,镜像运行时会生成默认的 hostname 是一串 hash 字符串,可能不是很美观。可以使用 -h 指定一个自己需要的名字。需要特别注意的是 不同镜像不可以使用相同的 hostname 所以最好不要用这个参数。例如: docker run -h Tokyo ubuntu bash

--name用于指定 镜像运行后产生的新数据保存为一个新的镜像。docker 镜像在停止后,再次运行相同的镜像,我们所进行的所有修改会丢失,虽然可以通过其他手段找回但是比较麻烦,一般用 --name指定一个新名字。注意此参数不可以和 --rm 混用。 例如 : docker run --name m3 ubuntu 为这次修改起一个新名字 然后使用 docker exec -it m3 bash 进入容器进行修改。镜像停止后使用 docker start m3 运行容器,使用 docker exec -it test bash` 进入容器进行修改。

-d 指定容器运行于后台,这个参数配合 --name 参数一起使用会比较爽,因为 docker 默认会使用 hash 码为新运行的实例起名。列如:docker run -itd --name nico ubuntu bash 。这样的话会在后台运行一个 Ubuntu 镜像,名为 nico ,我们可以使用 docker exec -it nico bash 进入实例。或者使用 docker stop nico 停止实例。

** docker 镜像状态管理 **

docker 的镜像镜像启动后,我们可以像普通日安软件一样管理它,控制它的运行状态。本小结的内容主要和 上一小结的 --name 一起使用。

创建一个 ubuntu 的镜像实例来作为本小结的演示 docker run -itd --name test ubuntu bash

当我们创实例后我们可以使用 docker exec -it test bash 进入实例进行操作,或者我们现在已经不需要这个实例了,我们可以使用 docker stop test 停止它,当然有 stop 参数就有 start 参数,之前已经演示过了,这里再演示一下。注意哦 start 只适用于已停止的实例,列如 docker start test

当然这其中还包含自启动和关闭自启动,不要想当然的意味 是 restart 参数,是 --restart 参数

docker run --restart=always --name test2 ubuntu bash

如果需要关闭它的自启动的需要使用 update 参数更新实例状态

docker update --restart=no test2

** 镜像管理 **

docker image 参数

曾经的镜像管理比较混乱,贼分散,现在统一采用 image 参数进行管理了,直观得多。

列出镜像

docker image ls

删除镜像

docker image rm 镜像名

** 查看 docker 后台运行的实例 **

有些时候我们需要看一下 docker 后台有没有运行我们需要的实例,可以使用 docker ps 进行查看

后记

记住了以上命令就能愉快的使用 docker 了,关于 Dockerfile 我觉得没有必要讲,Dockerfile 我觉得应该是开发者应该关心的事。用户只需要用的爽就行了。