docker第一次使用记录

安装docker

去官网上下载对应的

第一次使用

  1. 查看版本
$ docker --version

Docker version 18.06.1-ce, build e68fc7a
  1. 查看docker信息
$ docker info

Containers: 1
 Running: 0
 Paused: 0
 Stopped: 1
Images: 2
Server Version: 18.06.1-ce
...
  1. hello world

运行 hello-world 镜像,如果没有则下载并运行

$ docker run hello-world

latest: Pulling from library/hello-world
1b930d010525: 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.
...
  1. 查看镜像
$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        7 weeks ago         1.84kB
  1. 查看容器

如果容器还在运行,就不需要--all参数

$ docker container ls --all

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES
d2479723dcd4        hello-world         "/hello"            4 hours ago         Exited (0) 4 hours ago                       hardcore_cori

通过Dockerfile 来定义容器

Dockerfile

创建一个目录,在此目录下新建一个Dockerfile文件

# 将官方 Python 运行时用作父镜像
FROM python:2.7-slim

# 将工作目录设置为 /app
WORKDIR /app

# 将当前目录内容复制到位于 /app 中的容器中
ADD . /app

# 安装 requirements.txt 中指定的任何所需软件包
RUN pip install -r requirements.txt

# 使端口 80 可供此容器外的环境使用
EXPOSE 80

# 定义环境变量
ENV NAME World

# 在容器启动时运行 app.py
CMD ["python", "app.py"]

其中涉及应用的文件还未创建

应用文件

  1. requirements.txt
Flask
Redis
  1. app.py
from flask import Flask
from redis import Redis, RedisError
import os
import socket

# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route("/")
def hello():
    try:
        visits = redis.incr("counter")
    except RedisError:
        visits = "<i>cannot connect to Redis, counter disabled</i>"

    html = "<h3>Hello {name}!</h3>" \
           "<b>Hostname:</b> {hostname}<br/>" \
           "<b>Visits:</b> {visits}"
    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

构建应用

  1. 查看应用目录
$ ls

Dockerfile      app.py          requirements.txt
  1. 运行构建命令,创建Docker镜像,使用-t对镜像起别名
$ docker build -t friendlyhello
  1. 查看构建好的镜像
$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
friendlyhello       latest              4e3e33fac3e2        21 minutes ago      131MB
python              2.7-slim            99079b24ed51        7 days ago          120MB
hello-world         latest              fce289e99eb9        7 weeks ago         1.84kB

运行应用

正常模式

  1. 运行应用,使用-p将本机的4000端口映射到容器向外暴露的80端口
$ docker run -p 4000:80 friendlyhello
  1. 浏览器访问 http://localhost:4000或者使用curl
$ curl http://localhost:4000

<h3>Hello World!</h3><b>Hostname:</b> 65c750525420<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
  1. 终止应用CTRL+C

分离模式

  1. 通过-d将docker启动的应用在后台运行
$ docker run -d -p 4000:80 friendlyhello

63463f542b5c6dd2aa2840a1798272d4934982b3fdc2277befe5c6221e9a6c4d

返回的是应用的容器完整ID

  1. 查看应用
$ docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
7bfc58a8896a        friendlyhello       "python app.py"     3 seconds ago       Up 2 seconds        0.0.0.0:4001->80/tcp   heuristic_galileo

CONTAINER ID 与 页面上显示的Hostname值一致

  1. 终止应用

docker stop 根据 CONTAINER ID去终止应用

$ docker stop 7bfc58a8896a

将应用推送到镜像库

Docker Hub地址

  1. 本机登录
docker login
  1. 标记镜像

docker tag image username/repository:tag

$ docker tag friendlyhello zsq/hello-world:first
  1. 查看标记镜像
$ docker images

REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
friendlyhello        latest              4e3e33fac3e2        2 hours ago         131MB
zsq/hello-world      first               4e3e33fac3e2        2 hours ago         131MB
python               2.7-slim            99079b24ed51        7 days ago          120MB
hello-world          latest              fce289e99eb9        7 weeks ago         1.84kB
...

4.发布镜像

$ docker push zsq/hello-world:first
  1. 从远程镜像库拉取到本地并运行镜像

如果存在直接运行,否则将从远程拉取并运行

$ docker run -p 4000:80 zsq/hello-world:first

相关命令

docker build -t friendlyname .# 使用此目录的 Dockerfile 创建镜像
docker run -p 4000:80 friendlyname  # 运行端口 4000 到 90 的“友好名称”映射
docker run -d -p 4000:80 friendlyname         # 内容相同,但在分离模式下
docker ps                                 # 查看所有正在运行的容器的列表
docker stop <hash>                     # 平稳地停止指定的容器
docker ps -a           # 查看所有容器的列表,甚至包含未运行的容器
docker kill <hash>                   # 强制关闭指定的容器
docker rm <hash>              # 从此机器中删除指定的容器
docker rm $(docker ps -a -q)           # 从此机器中删除所有容器
docker images -a                               # 显示此机器上的所有镜像
docker rmi <imagename>            # 从此机器中删除指定的镜像
docker rmi $(docker images -q)             # 从此机器中删除所有镜像
docker login             # 使用您的 Docker 凭证登录此 CLI 会话
docker tag <image> username/repository:tag  # 标记 <image> 以上传到镜像库
docker push username/repository:tag            # 将已标记的镜像上传到镜像库
docker run username/repository:tag                   # 运行镜像库中的镜像

服务

服务是“生产中的容器”,一般一项服务仅运行一个镜像,但是可以对该镜像启用负载均衡

docker-compose.yml

定义、运行和扩展docker,也就是定义Docker容器在生产环境中的行为

version: "3"
services:
  web:
    # 将 username/repo:tag 替换为您的名称和镜像详细信息
    image: username/repository:tag
    deploy:
      replicas: 5
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "4000:80"
    networks:
      - webnet
networks:
  webnet:
  1. 将 Compose 文件设置为 version:"3"。本质上,这会使其兼容 swarm mode。
  2. 从镜像库中拉取指定镜像。
  3. 将镜像分为5个web运行,每个实例限制最多使用10%的CPU和50MB的RAM。
  4. 如果某个容器发生错误,立即重启容器。
  5. 将主机上的4000端口映射到docker(web)的80端口。
  6. 使用默认设置定义webnet网络(此为负载均衡的overlay网络)

运行服务

  1. 开启swarm管理节点
$ docker swarm init

如果没有执行过docker swarm init,将报this node is not a swarm manager

  1. 运行应用
$ docker stack deploy -c docker-compose.yml getstartedlab

Creating network getstartedlab_webnet
Creating service getstartedlab_web

getstartedlab为服务的别名

  1. 查看服务中容器的列表
$ docker stack ps getstartedlab

ID                  NAME                  IMAGE                  NODE                    DESIRED STATE       CURRENT STATE                ERROR               PORTS
kpdbgnl2p7yb        getstartedlab_web.1   zsq/one:1              linuxkit-025000000001   Running             Running about a minute ago
k6uqshqqfxkz        getstartedlab_web.2   zsq/one:1              linuxkit-025000000001   Running             Running about a minute ago
vfn8ys8cpkc3        getstartedlab_web.3   zsq/one:1              linuxkit-025000000001   Running             Running about a minute ago
4wtvs8qqxnul        getstartedlab_web.4   zsq/one:1              linuxkit-025000000001   Running             Running about a minute ago
bb2w7co8x3br        getstartedlab_web.5   zsq/one:1              linuxkit-025000000001   Running             Running about a minute ago

此时,web应用已经实现负载均衡了,通过http://localhost:4000可以看到每次刷新后容器ID都会发生改变,每次请求,将以循环方式选择5个从节点之一做出响应

  1. 查看服务
$ docker stack services getstartedlab

ID                  NAME                MODE                REPLICAS            IMAGE                  PORTS
tc12dkx8copc        getstartedlab_web   replicated          5/5                 zsq/one:1              *:4001->80/tcp
  1. 扩展服务

可以将docker-compose.yml中的replicas值改为2,重新运行docker stack deploy命令来扩展,无需事先清除技术栈或者终止容器

$ docker stack deploy -c docker-compose.yml getstartedlab

Updating service getstartedlab_web (id: tc12dkx8copcgy09dmng5h7z7)

再次查看容器列表,可以看到已经移除了3个

$ docker stack ps getstartedlab

ID                  NAME                  IMAGE                  NODE                    DESIRED STATE       CURRENT STATE                ERROR               PORTS
nhyp01413tb9        getstartedlab_web.1   zsq/one:1              linuxkit-025000000001   Running             Running about a minute ago
1zwklq2rbkpo        getstartedlab_web.2   zsq/one:1              linuxkit-025000000001   Running             Running about a minute ago
42xx8qkib6hh        getstartedlab_web.3   zsq/one:1              linuxkit-025000000001   Remove              Running 14 seconds ago
jkua7sao1m6g        getstartedlab_web.4   zsq/one:1              linuxkit-025000000001   Remove              Running 14 seconds ago
8r39nv3q7dyb        getstartedlab_web.5   zsq/one:1              linuxkit-025000000001   Remove              Running 14 seconds ago
  1. 清除服务应用
$ docker stack rm getstartedlab

Removing service getstartedlab_web
Removing network getstartedlab_webnet

但是单节点swarm仍在运行

  1. 清除swarm

先查看下,是否在运行

$ docker node ls

ID                            HOSTNAME                STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
89zkmhm6eqgjsigjzr71q4661 *   linuxkit-025000000001   Ready               Active              Leader              18.06.1-ce

清除swarm

$ docker swarm leave --force

Node left the swarm.

相关命令


docker stack ls              # 列出此 Docker 主机上所有正在运行的应用
docker stack deploy -c <composefile> <appname>  # 运行指定的 Compose 文件
docker stack services <appname>       # 列出与应用关联的服务
docker stack ps <appname>   # 列出与应用关联的正在运行的容器
docker stack rm <appname>                             # 清除应用
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259