ekwong.cn

尔康的博客

0%

Docker学习

在Docker官网https://docs.docker.com/get-started/看了一些文档,以下为文档大致摘要。

测试Kubernetes

在电脑上安装好 Docker Desktop后,点击设置,选择启用Kubernetes

新建一个文件,命名为 pod.yaml ,写入以下内容:

1
2
3
4
5
6
7
8
9
apiVersion: v1
kind: Pod
metadata:
name: demo
spec:
containers:
- name: testpod
image: alpine:3.5
command: ["ping", "8.8.8.8"]

在命令行输入以下命令执行这个 yaml文件,创建你的 pod

1
kubectl apply -f pod.yaml

检查你的 pod 是否在运行

1
kubectl get pods

关闭运行中的 pod

1
kubectl delete -f pod.yaml

启用 Docker Swarm

初始化

1
docker swarm init

运行一个简单的Docker服务,用基于alpine的文件系统,同样也是 ping 一下 8.8.8.8

1
docker service create --name demo alpine:3.5 ping 8.8.8.8

确认一下你的服务是否创造了一个正在运行的container:

1
docker service ps demo

确认你可以获取到相关的logs信息

1
docker service logs demo

最后,关闭测试服务

1
docker service rm demo

容器化一个应用

从GitHub的样例来建造一个image吧。

准备工作

1
2
git clone -b v1 https://github.com/docker-training/node-bulletin-board
cd node-bulletin-board/bulletin-board-app

Dockerfile 描述怎样为一个container编译一个私有文件系统,同时可以包含一些meta数据,这些meta数据描述如何运行一个基于此image的container。例如这个示例的Dockerfile的内容为:

1
2
3
4
5
6
7
8
FROM node:6.11.5

WORKDIR /usr/src/app
COPY package.json .
RUN npm install
COPY . .

CMD [ "npm", "start" ]

编写一个 Dockerfile 是容器化一个应用的第一步。你可以一步步地猜测这些 Dockerfile 命令如何构建我们的image。例如上述的文件含义如下:

  • 在现有的image (名字为 node:6.11.5)的基础上
  • 使用 WORKDIR 指定所有的后续操作都在image文件系统的 /usr/src/app 下执行,即指定本image(在容器中)的工作目录
  • 使用 COPY 指令将 package.json 文件从宿主复制到image的当前位置(.),在本例中,就是复制到image的 /usr/src/app/package.json
  • 使用 RUN 指令在你的image文件系统中执行 npm install 命令,在本例,会读取 package.json 文件来安装你的应用的依赖;
  • 使用 COPY 指令将你的应用的资源代码从宿主复制到image的文件系统

以上命令是用于构造我们的image的文件系统,CMD 指令在image中,指定一些meta数据描述如何基于此image运行一个container。在本例中,image容器化的过程是 npm install

构建和测试你的image

在 node-bulletin-board/bulletin-board-app 目录下,打开命令行,输入以下指令

1
docker image build -t bolletinboard:1.0 .

构建成功后,使用构建出来的image启动一个container,可以先查看当前宿主的image列表

1
docker image ls

然后找到刚构建出来的image id,在命令行运行:

1
2
3
docker container run -p 8000:8080 --detach --name bb $IMAGE_ID
# 若想公开多个端口
docker container run -p 8000:8080 -p 9000:9090 --detach --name bb $IMAGE_ID

在这里,我们用了一些flag,例如:

  • -p告知docker宿主与container的端口映射关系,例如本例中,宿主的端口 8000 映射到 container的端口 8080
  • –detach 要求Docker把此container在后台运行;
  • –name 给运行起来的container起一个名字为 bb;

值得注意的是,我们并没有指定container要运行什么。由于我们在构建image的时候,在Dockerfile中使用了CMD指令,当container运行起来时,Docker自动执行 npm run 命令。

可以使用以下指令查看正在运行的container

1
docker container ls

进入容器内部

1
docker exec -ti container_name /bin/bash

如果你需要停止容器,可以使用指令

1
docker container rm --force $CONTAINER_ID

若需删除image,可以使用指令:

1
2
3
docker image rm -f $IMAGE_ID
#
docker image rm -f $IMAGE_NAME:$TAG

配置仓库镜像

由于Docker的中央仓库位于国外,拉去image的时候,速度会比较慢,所以建议配置国内镜像

编辑 /etc/docker/daemon.json 文件(如果目录或文件不存在,则创建之)

添加一下内容:

1
2
3
4
5
6
7
8
9
{
...
# 增加这个,就是配置了网易的镜像
"registry-mirrors": [
"https://hub-mirror.c.163.com"
]
#
...
}

然后重启docker,以CentOS 7为例

1
2
systemctl stop docker
systemctl start docker

创建Docker私有仓库

此处内容参考官网文档

在本地运行私有仓库

在创建Docker私有仓库前,请确保你的设备已经安装了docker并且在运行。

一个私有仓库,其实就是一个 registry 镜像的运行实例,在本地运行一个registry实例,并且绑定在5000端口上

1
docker run -d -p 5000:5000 --restart=always --name registry registry:2

这样,本地的私有仓库就跑起来了。

把镜像推送到本地私有仓库

现在,我们罗列一下当前本地有哪些image:

1
2
3
4
5
6
7
8
9
10
11
12
[root@node01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.aliyuncs.com/google_containers/kube-proxy v1.17.4 6dec7cfde1e5 4 weeks ago 116 MB
docker.io/ubuntu 16.04 77be327e4b63 6 weeks ago 124 MB
registry.aliyuncs.com/google_containers/kube-proxy v1.17.3 ae853e93800d 8 weeks ago 116 MB
docker.io/kubernetesui/dashboard v2.0.0-rc5 fe0df1b24096 2 months ago 126 MB
localhost:5000/cm_in_centos7_front latest 895a50dc2bb7 2 months ago 2.86 GB
docker.io/kubernetesui/metrics-scraper v1.0.3 3327f0dbcb4a 2 months ago 40.1 MB
docker.io/registry 2 708bc6af7e5e 2 months ago 25.8 MB
localhost:5000/cm_in_centos7 latest 001a9b846404 3 months ago 2.66 GB
quay.mirrors.ustc.edu.cn/coreos/flannel v0.11.0-amd64 ff281650a721 14 months ago 52.6 MB
registry.aliyuncs.com/google_containers/pause 3.1 da86e6ba6ca1 2 years ago 742 kB

当前本地有一个ubuntu:16.04的image,我们想它推送到本地私有仓库(本地和本地私有仓库是不同的!

先把这个image起个新的名字吧:

1
2
# docker tag $CURRENT_NAME:CURRENT_VERSION $NEW_NAME:NEW_VERSION
docker tag ubuntu:16.04 localhost:5000/my-ubuntu:16.04

然后把这个image推送到本地私有仓库:

1
docker push localhost:5000/my-ubuntu:16.04

这样,本地私有仓库就有这个 my-ubuntu:16.04 的image了。