当前位置: 首页 > 工具软件 > docker-book > 使用案例 >

第一本 Docker 书(The Docker Book)笔记

岑俊明
2023-12-01

第一本 Docker 书(The Docker Book)笔记

第 1 章 简介

第 2 章 安装 Docker

  • Ubuntu 安装 Docker
# 添加 Docker 的 ATP 仓库
sudo sh -c "echo deb https://apt.dockerproject.org/repo ubuntu-trusty main > /etc/apt/sources.list.d/docker.list"
sudo lsb_release --codename | cut -f2
# trusty
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89.... # Docker 仓库的 GPG 密钥
sudo apt-get update # 更新 APT 源
sudo apt-get install docker-engine
sudo docker info
  • Red Hat 系列安装 Docker

RHEL 6/CentOS 6

# 安装 EPEL 源
sudo rpm -Uvh http://download.fedoraproject.org/pub/eple/6/i386/epel-release-6-8.noarch.rpm
sudo yum -t install docker-io

docker info

sudo service docker start
sudo service docker enable

RHEL 7

# 要想访问 Red Hat 的 Docker 软件包和文档,必须是 Red Hat 的客户,并拥有 RHEL 服务器订阅授权
sudo subscription-manager repos --enable=rhel-7-server-extras-rpms
sudo yum install -y docker

sudo systemctl start docker
sudo systemctl enable docker

Fedora

# Fedora 19
sudo yum install -y docker-io

# Fedora 20
sudo yum -y install docker

# Fedora 21
sudo yum -y install docker-io

# Fedora 22
sudo dnf install docker # yum 命令不被推荐使用(由 dnf 命令取代)
  • Mac OS X 或 Windows 安装:Docker Toolbox

OS X 安装 Docker

wget https://github.com/docker/toolbox/releases/download/v1.9.1/DockerToolbox-1.9.1.pkg
# 下载后运行

docker info

Windows 安装 Docker

wget https://github.com/docker/toolbox/releases/download/v1.9.1/DockerToolbox-1.9.1.exe
# 或者可以使用包管理器 Chocolatey 来安装

# 下载后运行
docker info
docker-machine ip # 查看 Docker Toolbox 的 IP 地址(或 echo $DOCKER_HOST)

注意:任何使用卷或带有 -v 选项的 docker run 命令挂载到 Docker 容器的示例都不能在 Windows 上工作。用户无法将宿主机上的本地目录挂载到运行在 Docker Toolbox 虚拟机内的 Docker 宿主机上,因为它们无法共享文件系统。

  • Docker 安装脚本
curl https://get.docker.com./ | sudo sh
  • 二进制安装(不推荐:降低了 Docker 软件包的可维护性)
wget https://get.docker.com/builds/Linux/x86_64/docker-lastest.tgz

第 3 章 Docker 入门

# 启动容器(交互式)
sudo docker run --name bob_the_container -i -t ubuntu /bin/bash
exit

# 查看运行的容器
docker ps -l
# 启动容器
sudo docker start bob_the_container
# 附着到正在运行的容器
sudo docker attach bob_the_container
exit

# 后台运行
sudo docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
# 查看日志输出
sudo docker logs daemon_dave
sudo docker logs -ft daemon_dave  # -f 动态显示,-t 显示时间戳

# 查看容器进程占用情况
sudo docker top daemon_dave
sudo docker stats daemon_dave

# 对容器执行命令
sudo docker exec -d daemon_dave touch /etc/new_config_file
sudo docker exec -t -i daemon_dave /bin/bash

# 停止运行的容器
sudo docker stop daemon_dave

# 自动重启
sudo docker run --restart=always --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

# 检查容器详情
sudo docker inspect daemon_dave
sudo docker inspect --format='{{ .State.Runing }}' daemon_dave
sudo docker inspect --format='{{ .NetworkSettings.IPAddress }}' daemove_dave
sudo docker inspect --format='{{ .Name }} {{ .State.Runing }}' daemon_dave bob_the_container # 查看多个容器

# 删除容器
sudo docker rm 80430f
sudo docker rm `sudo docker ps -a -q`  # 删除所有容器

第 4 章 使用 Docker 镜像和仓库

# 列出镜像
sudo docker images
sudo docker images ubuntu

# 查找镜像
sudo docker search puppet

# 拉取镜像
sudo docker pull jamtur01/puppetmaster
sudo docker pull ubuntu:12.04

# 运行镜像
sudo docker run -t -i --name new_container ubuntu:12.04 /bin/bash

构建镜像

sudo docker run -i -t ubuntu /bin/bash
apt-get -yqq update
apt-get -y install apache2
exit

# 保存新的镜像
sudo docker commit 4aab3ce3cb76 jamtur01/apache2
sudo docker commit -m "A new custom image" -a "James Turnbull" 4aab3ce3cb76 jamtur01/apache2:webserver


# 基于 Dockerfile 构建镜像
sudo docker build . -t jamtur01/static_web

# 查看分层信息
sudo docker history 22d47c

# 映射端口
sudo docker run -d -p 8080:80 --name static_web jamtur01/static_web nginx -g "daemon off"

# 查看映射到本机的端口
sudo docker port 47a3bc9a 80

# 登录
sudo docker login

# 推送镜像
sudo docker push jamtur01/static_web

# 删除镜像
sudo docker rmi jamtur01/static_web
sudo docker rmi `docker images -a -q`

Dockerfile 关键指令

  • CMD
  • ENTRYPOINT
  • WORKDIR
  • ENV
  • USER
  • VOLUME
  • ADD
  • COPY
  • LABEL
  • STOPSIGNAL
  • ARG
  • ONBUILD

Dockerfile 示例

FROM ubuntu:14.04
MAINTAINER James Turnbull <james@example.com>
ENV REFRESHED_AT 2014-06-01

RUN apt-get -yqq update
RUN apt-get -yqq install wget
RUN wget -O - http://packages.elasticsearch.org/GPG-KEY-elasticsearch |apt-key add -
RUN echo 'deb http://packages.ealsticsearch.org/logstash/1.4/debian stable main' > /etc/apt/sources.list.d/logstash.list
RUN apt-get -yqq update
RUN apt-get -yqq install logstash

ADD logstash.conf /etc/

WORKDIR /opt/logstash

ENTRYPOINT ["bin/logstash"]
CMD ["--config=/etc/logstash.conf"]

Registry

# 运行 registry 容器
sudo docker run -p 5000:5000 registry:2
sudo docker images jamtur01/static_web

# 打标签
sudo docker tag 22d47c docker.example.com:5000/jamtur01/static_web

# 推送到私有的 registry
sudo docker push docker.example.com:5000/jamtur01/static_Web

sudo docker run -i -t docker.example.com:5000/jamtur01/static_web /bin/bash

第 5 章 在测试中使用 Docker

# 映射目录
sudo docker run -d -p 80 --name website -v $PWD/website:/var/www/htmlwebsite:ro jamtur01/nginx nginx

Docker Networking

# 创建网络(默认为桥接)
sudo docker network create app
sudo docker network ls

# 加入 app 网络
sudo docker run -d --net=app --name db jamtur01/redis
sudo docker run -p 4567 --net=app --name webapp -t -i -v $PWD/webapp:/opt/webapp jamtur01/sinatra /bin/bash

# 将已有容器连接到网络
sudo docker network connect app db2
sudo docker network inspect app

# 从网络中断开
sudo docker network disconnect app db2

容器链接(只能工作于同一台 Docker 宿主机)

sudo docker run -d --name redis jamtur01/redis
sudo docker run -p 4567 --name webapp --link redis:mydb -t -i -v $PWD/webapp_redis:/opt/webapp jamtur01/sinatra /bin/bash

第 6 章 使用 Docker 构建服务

第 7 章 Docker 编配和服务发现

  • 安装 Docker Compose

Linux

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

docker-compose --version

通过 Pip 安装

sudo pip install -U docker-compose
  • docker-compose.yml 示例
web:
  image: jamtur01/composeapp
  # 或 build: /home/james/composeapp
  command: python app.py
  ports:
    - "5000:5000"
  volumes:
    - .:/composeapp
  links:
    - reids
redis:
  image: redis
# 上述效果同:
sudo docker run -d -p 5000:5000 -v .:/composeapp --link redis:redis --name jamestur01/composeapp python app.py

# 查看帮助
docker-compose help
docker-compose help ps

# 运行 Compose
sudo docker-compose up
sudo docker-compose up -d  # 以守护进程运行

# 查看 compose 服务
sudo docker-compose ps

# 查看服务日志
sudo docker-compose logs

# 停止服务
sudo docker-compose stop

# 删除服务
sudo docker-compose rm
  • Swarm
sudo docker pull swarm
docker images swarm

sudo docker run --rm swarm create
# b811b0bc438c... 集群 ID


# 在各节点上执行,加入集群
sudo docker run -d swarm join --addr=10.0.0.125:2375 token://b811b0bc438c...
# b4f6bbs... 节点 ID
docker logs b4f6bbs...

sudo docker run -d swarm join --addr=10.0.0.135:2375 token://b811b0bc438c...
# cd4dka3... 节点 ID
docker logs cd4dka3...

# 列出 swarm 节点
sudo docker --rm swarm list token://b811b0bc438c...
# 10.0.0.125:2375
# 10.0.0.135:2375

# 启动 swarm 集群管理者
sudo docker run -d -p 2380:2375 swarm manage token://b811b0bc438c...

# 在 swarm 集群中运行命令
sudo docker -H tcp://localhost:2380 info
# ...
# Nodes: 2
# joker: 10.0.0.135:2375
# ...
# smoker: 10.0.0.125:2375
# ...

for i in `seq 1 6`; do sudo docker -H tcp://localhost:2380 run -d --name www-$i -p 80 nginx; done
sudo docker -H tcp://localhost:2380 ps
# 生成的 6 个容器平均分配在集群的两个节点
# ... nginx ... joker/www-6
# ... nginx ... smoker/www-3
# ... nginx ... joker/www-5
# ... nginx ... smoker/www-4
# ... nginx ... joker/www-2
# ... nginx ... smoker/www-1

注:Swarm 根据过滤器和策略的结合来决定在哪个节点上运行容器

第 8 章 使用 Docker API

第 9 章 获得帮助和对 Docker 进行改进

 类似资料: