07月03, 2018

docker深入笔记

之前写过一个简单篇,这次来一个深入的。

安装

docker要基于64位,所以如果centos是32位的话,就无法通过yum install docker-io来安装。

这里有两个命令:

cat /etc/issue  # 查看系统版本
getconf LONG_BIT # 查看是32位还是64位

安装完成之后,可以通过:

docker version
docker info

alt

上面的截图是表示docker还未启动,所以我们需要启动一下。

systemctl start docker

alt

Docker架构

alt

阿里云加速

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://fwvjnv59.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

image

  • Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器
  • image 文件可以看作是容器的模板
  • Docker 根据 image 文件生成容器的实例
  • 同一个 image 文件,可以生成多个同时运行的容器实例
  • 一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成
命令 含义 案例
images 查看全部镜像 docker image ls
pull 拉取镜像 docker pull [imageName]
rmi 删除镜像 docker rmi [imageName]

查找镜像

docker search ubuntu

alt

字段 含义
NAME 名称
DESCRIPTION 描述
STARTS 星星的数量
OFFICIAL 是否官方源

查看镜像

比如说,我们先pull一个node的image。

docker image ls

alt

字段 含义
REPOSITORY 仓库地址
TAG 标签
IMAGE_ID 镜像ID
CREATED 创建时间
SIZE 镜像大小

拉取镜像

docker  pull hello-world
  • docker image pull是抓取 image 文件的命令
  • library/hello-world是 image 文件在仓库里面的位置,其中library是 image的作者,hello-world是 image 文件的名字
  • Docker 官方提供的 image 文件,都放在library组里面,所以它的是默认组,可以省略 docker image pull hello-world

删除镜像

docker rmi  hello-world

容器

  • docker run 命令会从 image 文件,生成一个正在运行的容器实例。
  • docker container run命令具有自动抓取 image 文件的功能。如果发现本地没有指定的 image 文件,就会从仓库自动抓取
  • 输出提示以后,hello world就会停止运行,容器自动终止。
  • 有些容器不会自动终止
  • image 文件生成的容器实例,本身也是一个文件,称为容器文件
  • 容器生成,就会同时存在两个文件: image 文件和容器文件
  • 关闭容器并不会删除容器文件,只是容器停止运行

命令

命令 含义 案例
run 从镜像运行一个容器 docker run [imageName]
ps 查看当前运行的容器 docker ps -a -l
kill [containerId] 终止容器(发送SIGKILL ) docker kill [containerId]
rm [containerId] 删除容器 docker rm [containerId]
start [containerId] 启动已经生成、已经停止运行的容器文件 docker start [containerId]
stop [containerId] 终止容器运行 (发送 SIGTERM ) docker stop [containerId]
logs [containerId] 查看 docker 容器的输出 docker logs [containerId]
exec [containerId] 进入一个正在运行的 docker 容器 docker container exec -it [containerID] /bin/bash
cp [containerId] 从正在运行的 Docker 容器里面,将文件拷贝到本机 docker container cp [containID]:app/package.json .

启动容器

docker run ubuntu /bin/echo "Hello world"

alt

  • docker: Docker 的二进制执行文件。
  • run:与前面的 docker 组合来运行一个容器。
  • ubuntu指定要运行的镜像,Docker首先从本地主机上- 查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
  • /bin/echo "Hello world": 在启动的容器里执行的命令

Docker以ubuntu镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果

查看容器

docker ps  # 当前运行的容器
docker -a  # 所有的容器,包括停止的
docker -l   # 显示最新的那个容器

alt

字段 含义
CONTAINER ID 容器ID
IMAGE 使用的镜像
COMMAND 使用的命令
CREATED 创建时间
STATUS 状态
PORTS 端口号
NAMES 自动分配的名称

运行交互式的容器

docker run -i -t ubuntu /bin/bash

alt

  • -t=--interactive 在新容器内指定一个伪终端或终端。
  • -i=--tty 允许你对容器内的标准输入 (STDIN) 进行交互。

我们可以通过运行exit命令或者使用CTRL+D来退出容器。

后台运行程序

docker run --detach centos ping www.baidu.com

然后我们可以拿到它的容器,打印结果:

alt

docker logs --follow 92f3762ab206

alt

docker stop 92f3762ab206  # 停止运行程序

kill

docker kill 92f3762ab206

删除容器

docker rm 92f3762ab206

killrm的区别在于kill可以删除运行中的容器,而rm不行。

制作个性化镜像

我们运行的容器可能在镜像的基础上做了一些修改,有时候我们希望保存起来,封装成一个更新的镜像。

docker commit使用

按文中所说,我们通过下面的命令进行新的封装:

docker commit -m "add vim" -a "zpu" e94daf367525 zpu/centos-vim:latest

命令中-m表示提交信息,-a表示作者,e94daf367525表示容器ID。

运行之后,查看docker images,我们可以看到:

alt

制作Dockerfile

  • Docker 的镜像是用一层一层的文件组成的
  • docker inspect命令可以查看镜像或者容器
  • Layers就是镜像的层文件,只读不能修改。基于镜像创建的容器会共享这些文件层
docker inspect centos

alt

准备

npm install express-generator -g
express app

在app文件夹中加一个文件:dockerignore,其内容为:

.git
node_modules

在app的同级加一个名为Dockerfile的文件。

编写Dockerfile

命令 含义 案例
FROM 继承的镜像 FROM node
COPY 拷贝 COPY ./app /app
WORKDIR 指定工作路径 WORKDIR /app
RUN 编译打包阶段运行命令 RUN npm install
EXPOSE 暴露端口 EXPOSE 3000
CMD 容器运行阶段运行命令 CMD npm run start

Dockerfile文件内容为:

FROM node
COPY ./app /app
WORKDIR /app
RUN npm install
EXPOSE 3000
CMD npm start
  • FROM 表示该镜像继承的镜像 :表示标签
  • COPY 是将当前目录下的app目录下面的文件都拷贝到image里的/app目录中
  • WORKDIR 指定工作路径,类似于执行 cd 命令
  • RUN npm install 在/app目录下安装依赖,安装后的依赖也会打包到image目录中
  • EXPOSE 暴露3000端口,允许外部连接这个端口
  • CMD 执行命令

创建image

docker build -t zpu/express-demo .
  • -t用来指定image镜像的名称,后面还可以加冒号指定标签,如果不指定默认就是latest
  • . 表示Dockerfile文件的所有路径,.就表示当前路径

从新的镜像运行容器

docker run -d -p 3333:3000 zpu/express-demo

然后我们就可以查看到结果了:

alt

发布image

先要注册,我是在https://cloud.docker.com/上注册的,另外一个hub,人机校验一直过不去,也是醉了。

docker login
docker push zhangpu/express-demo

alt

alt

更详细的发布,可以参考下面的截图:

alt

Docker 入门教程

数据盘

  • 删除容器的时候,容器层里创建的文件也会被删除掉,如果有些数据你想永久保存,比如Web服务器的日志,数据库管理系统中的数据,可以为容器创建一个数据盘。
  • 创建容器的时候我们可以通过-v或--volumn给它指定一下数据盘

指定数据盘

mkdir ~/data
docker run -v ~/data:/mnt -ti --name logs2 centos bash
cd /mnt
echo 3 > 3.txt
exit
cat ~/data/3.txt

多个容器间共享一个数据盘

如果你有一些数据想在多个容器间共享,或者想在一些临时性的容器中使用该数据,那么最好的方案就是你创建一个数据卷容器,然后从该临时性的容器中挂载该数据卷容器的数据。

docker run -v ~/data:/mnt -ti --name logger centos bash
docker run --volumes-from logger --name logger1 -i -t centos bash
docker run --volumes-from logger --name logger2 -i -t centos bash

compose

Compose 是一个用户定义和运行多个容器的 Docker 应用程序。在 Compose 中你可以使用 YAML 文件来配置你的应用服务。然后,只需要一个简单的命令,就可以创建并启动你配置的所有服务。 使用 Compose 基本会有如下三步流程:

  • 在 Dockfile 中定义你的应用环境,使其可以在任何地方复制。
  • 在 docker-compose.yml 中定义组成应用程序的服务,以便它们可以在隔离的环境中一起运行。
  • 最后,运行docker-compose up,Compose 将启动并运行整个应用程序。

比如我们要做一个需求:nginx提供80端口,反向代理到上面的express项目去。

然后我们的目录结构如下:

alt

blog里面的内容同上面的。nginx目录里面的Dockerfile内容如下:

FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80

nginx.conf的内容如下:

events{  
    use epoll;  
}
http {
  server {
    listen 80;
    location / {
      proxy_pass http://blog:3000;
    }
  }
}

docker-compose.yml的内容如下:

version: '2.0'
services:
   blog:
     build: blog
     networks:
      - default
     ports:
      - "3000:3000"

   nginx:
     build: nginx
     networks:
      - default
     ports:
      - "80:80"

然后运行命令:

docker-compose up -d

最后可以查看curl http://localhost

alt

需要指出的是,docker-compose一开始并不存在,简单的做法如下:

curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

再就可以通过/usr/local/bin/docker-compose up -d来执行了。

结语

我个人compose那一块的深入配置,还是有点蒙B的。基本配置,看起来好像问题不那么大。

具体还是得要多趟趟坑啥的,才能进一步地理解docker。

本文链接:www.my-fe.pub/post/docker-deep-note.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。