docker

avatarplhDigital nomad

搭建的例子

docker 基本概念

  • image 镜像 其实就是操作系统的抽象集合,他可以是nginx 也可以是 mysql, 也可以是Ubuntu,Centos

  • container 容器 image快照 + 一系列部署操作的抽象集合,

docker ps   # 查看运行的container
docker ps -a  # 查看所有的快照
如果你在运行docker run -it --rm ubuntu / 加上了--rm的话,利用exit 命令推出系统,快照就会立即销毁,否则docker ps -a就会看到很对死尸
  • repository 仓库 线上仓库

docker 中的分层与git对比

  • git分成本地代码,这部分是git,至于本地未git add的文件,则不属于git里面,他们没有被git标记,在切换分支的时候,未git add的文件也不会发生更改,切换,因此,git add .之后的代码,属于第一个层次,也就是本地代码,
  • 本地远程分支,这部分属于 git commit -am'push'之后的代码,他们会出现在 git log里面,可以看到,commit 之后的代码,本地分支超前于线上分支 image
  • git push之后的代码,就是线上分支了.下面是分支合并图. image

docker中也分为 container image repository ,这三个层次和git有异曲同工之妙用,,我也曾经怀疑,git时候能替代docker,事实证明, 这完全是两个不同的东西.

  • repository 线上仓库了,

  • image 快照,这个可以代表一个个系统,实际上通过命令行,它是可以登录的,

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
cecd0b0f9487        friendlyhello       "python app.py"          2 hours ago         Up 2 hours          0.0.0.0:8080->80/tcp   goofy_brattain
b49f2755005c        nginx               "nginx -g 'daemon of…"   2 hours ago         Up 2 hours                                 docker-nginx

docker exec -it b49f2755005c /bin/bash
root@linuxkit-025000000001:/# 

image

  • container 最终的容器 , 通过docker build [image id] 来创建容器.事实上,image仅仅只是静止的系统快照,而真正运行起来,还得靠container

docker run命令详解

请仔细查看下面这条的命令,此命令将会启动 Node 容器,将当前应用程序目录挂载到容器中,然后在应用程序上运行 npm install:

docker run -it --rm --name lllnode -v "$PWD":/usr/src/myapp -w /usr/src/myapp node:0.10.40 npm install
  • 基础命令是 docker run � node:0.10.40,它创建一个容器实例并运行您之前拉取的 node:0.10.40 镜像。

  • -it 开关指定您想要一个前台交互式终端。(备用模式是分离的后台进程,可以使用 -d 指定它。)

  • --rm 开关指定执行清理,表示在您退出容器后,Docker 会立即删除它。如果没有指定此开关,该容器会以停止状态持久保存在磁盘上,而且您可以从中断点开始重新启动它。但是,对于忘记删除容器实例的用户而言,重新启动容器是磁盘耗尽的常见来源。如果不使用 --rm,那么任何时候都能运行以下命令来查看您遗留下了多少陈旧的停止容器(数量可能会让您吃惊):

docker ps -a

↘ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                  NAMES
cecd0b0f9487        friendlyhello       "python app.py"          2 hours ago         Up 2 hours                 0.0.0.0:8080->80/tcp   goofy_brattain
5b7005a1c8dd        friendlyhello       "python app.py"          2 hours ago         Created                                           jolly_babbage
9e276854d0d1        friendlyhello       "python app.py"          2 hours ago         Exited (0) 2 hours ago                            zealous_roentgen
0ce31bc738ca        5a42f7575b51        "python app.py"          2 hours ago         Exited (0) 2 hours ago                            vibrant_taussig
5a302f9b09e6        5a42f7575b51        "python app.py"          2 hours ago         Exited (0) 2 hours ago                            epic_hermann
67783f9a98e7        0a189dbd9625        "python app.py"          2 hours ago         Exited (0) 2 hours ago                            optimistic_gates
38cae2317126        0a189dbd9625        "python app.py"          2 hours ago         Exited (0) 2 hours ago                            cranky_wright
a42f207fe69c        0a189dbd9625        "python app.py"          2 hours ago         Exited (0) 2 hours ago                            laughing_pascal
f14ac314fab3        0a189dbd9625        "python app.py"          2 hours ago         Created                                           infallible_galileo
7554e3d24733        0a189dbd9625        "python app.py"          2 hours ago         Created                                           cocky_gauss
ad90f88aae61        0a189dbd9625        "python app.py"          2 hours ago         Exited (0) 2 hours ago                            confident_stonebraker
b49f2755005c        nginx               "nginx -g 'daemon of…"   2 hours ago         Up 2 hours                                        docker-nginx
871284810b8f        0a189dbd9625        "python app.py"          2 hours ago         Exited (0) 2 hours ago                            sleepy_lumiere
2701daafc205        0a189dbd9625        "python app.py"          2 hours ago         Exited (0) 2 hours ago                            youthful_almeida
a1ecaa248c33        0a189dbd9625        "python app.py"          2 hours ago         Exited (0) 2 hours ago                            distracted_noyce
75472ebd7527        0a189dbd9625        "python app.py"          2 hours ago         Exited (0) 2 hours ago                            wizardly_lewin
31b8b4315a91        friendlyhello       "python app.py"          3 hours ago         Exited (1) 3 hours ago                            zealous_newton
448c02beb030        friendlyhello       "python app.py"          3 hours ago         Exited (1) 3 hours ago                            relaxed_mendeleev
69d7e616cbc6        friendlyhello       "python app.py"          3 hours ago         Exited (0) 3 hours ago                            awesome_zhukovsky
6b73e11c4bcb        hello-world         "/hello"                 4 hours ago         Exited (0) 4 hours ago                            dreamy_wozniak
b95671d0eaae        node                "-p 8011:8011"           4 hours ago         Created                                           heuristic_heyrovsky
8a10bf9012ca        node                "-p 8011:8011"           4 hours ago         Created                                           admiring_goldwasser
a40bfac4856f        node                "node"                   4 hours ago         Exited (0) 4 hours ago                            clever_sammet
123bdb6464c0        node                "node"                   5 hours ago         Exited (0) 5 hours ago                            boring_engelbart
bb59f1d55441        67b4a016f8cb        "python app.py"          6 hours ago         Created                                           compassionate_montalcini
7eb1e35ad6f7        67b4a016f8cb        "python app.py"          6 hours ago         Exited (137) 5 hours ago                          stupefied_mahavira
c0a1ba9ddc2f        67b4a016f8cb        "python app.py"          6 hours ago         Exited (137) 6 hours ago                          friendly_williams
c7b0e05c3dae        67b4a016f8cb        "python app.py"          6 hours ago         Exited (0) 6 hours ago                            jolly_germain
50248307b5ec        67b4a016f8cb        "python app.py"          6 hours ago         Created                                           nifty_dijkstra
77925356d23d        67b4a016f8cb        "python app.py"          6 hours ago         Exited (0) 6 hours ago                            upbeat_wiles
380fcb2c68f6        ubuntu              "bash"                   6 hours ago         Exited (137) 6 hours ago                          peaceful_haibt
d6d141ec3a3c        hello-world         "/hello"                 6 hours ago         Exited (0) 6 hours ago                            tender_banzai
1ea999cf3a8a        hello-world         "/hello"                 6 hours ago         Exited (0) 6 hours ago                            stoic_sammet
f5319374a270        centos              "/bin/bash"              6 hours ago         Exited (0) 6 hours ago                            elegant_cori
c3df7c080b2d        centos              "/bin/bash"              7 hours ago         Exited (0) 7 hours ago                            awesome_colden
ade9abfeafac        centos              "/bin/bash"              7 hours ago         Exited (0) 7 hours ago                            boring_benz
e9cb0ab2d530        ubuntu              "/bin/bash"              5 weeks ago         Exited (0) 5 weeks ago                            leet
ada992977b46        leetcode            "/app/main"              5 weeks ago         Exited (0) 5 weeks ago                            leetcode
e5f38f0f41a5        leetcode            "/app/main"              5 weeks ago         Exited (0) 5 weeks ago                            heuristic_pike
0b8eaafae5c6        4250dcf6b479        "/bin/sh -c 'pip ins…"   6 weeks ago         Exited (2) 6 weeks ago                            modest_cocks
dc2cbf43aa19        chat                "python ./socket_cli…"   6 weeks ago         Exited (2) 6 weeks ago                            jovial_feistel
ef4e207fe8d4        chat                "python ./socket_cli…"   6 weeks ago         Exited (2) 6 weeks ago                            loving_cocks
285bc232db1b        974428bc7560        "python ./socket_cli…"   6 weeks ago         Exited (1) 6 weeks ago                            distracted_almeida
5a37071f357c        centos:latest       "/bin/bash"              6 weeks ago         Exited (255) 6 weeks ago                          festive_benz

# 这么多躺尸容器,一键删除吧
docker rm < CONTAINER ID >
一个个删除太慢了
docker rm `docker ps -a | grep [Created|Exited] | awk '{print $1}'`
批量删除 Created从未使用的 和 Exited已退出的 的吧
  • --name lllnode 选项显式命名容器,这对在其他 Docker 命令中引用该容器很有用。如果没有显式命名容器,Docker 会为它分配一个生成的文本名称 — 这个名称通常没什么意义。您还可以通过内部 ID(一个很长、对人类不友好的十六进制字符串)来引用该容器。

  • -v "$PWD":/usr/src/myapp 选项创建一个卷挂载点。将您当前的工作目录 ($PWD) 挂载为容器内的 /usr/src/myapp。然后可从该容器内访问应用程序的 Node.js 源代码(或您当前的工作目录中可能拥有的其他任何 Node.js 源代码)。

  • -w /usr/src/myapp 选项设置您运行的命令的工作目录。在这个示例中,工作目录更改为挂载的卷。

  • docker run 命令末尾的 npm install 命令在工作目录上的容器内运行。最终结果是您通过容器在当前目录上运行 npm install— 而不安装 Node.js 或它的任何前提软件。

  • --env PORT=8011 环境变量命名

Docker的四种网络模式

  • --net有四个选项
    • none模式:使用–net =none指定;
    • net=host 全部暴露所有端口 ,但是mac系统下无效... 如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
    • bridge模式:使用–net =bridge指定,默认设置;
    • container模式:使用–net =container:NAMEorID指定。

image

docker中的 run 与 attach 与 exec的区别

一个是运行,一个是hack+同步操作介入,,exec是无干扰的hack,,,docker 简直是开发神器.... image

docker builddocker image build

然并无卵区别, docker image build 根据当前文件 的Dockerfile创建一个快照 image,Dockerfile 语法自己查官网,....

image

docker run 命令详解

可以依据网络上的快照,也可以依据自己docker build创建的快照来运行容器,换句话说,本机没有的快照,就会去网络上下载一个...然后下次本机就有了,就用本机的.

docker run --rm -it -v <宿主主机目录:容器目录> -w <容器初始目录> <image快照名称> bash  

于是就运行了一个退出后立即销毁的容器,并且自带交互式命令行的容器.

入门操作 - 3分钟内系列

跑下面一系列最新版nginx apache, nodejs , tomcat , php , python 服务器

nginx

Dockerfiles 文件

FROM nginx 
RUN nginx

运行命令

docker build --tag=my-nginx .     # 创建镜像
docker run -p 8080:80 --rm my-nginx

image

apache

Dockerfiles 文件

FROM httpd

运行命令

docker build --tag=my-apache .     # 创建镜像
docker run -p 80:80 --rm my-apache

image

node

Dockerfiles 文件

FROM node
WORKDIR /app
COPY . /app

运行命令

docker build --tag=my-node .     # 创建镜像
docker run -p 80:80 --rm my-node

image

tomcat

FROM tomcat

运行命令

docker build --tag=my-tomcat .     # 创建镜像
docker run -p 80:8080 --rm my-tomcat

image

python

不会弄...

php

不会弄...

开发环境下的共享模式

docker run --rm -p 80:80 -v $(pwd):/usr/share/nginx/html --name my-nginx nginx

运行之后,当前目录下的文件和容器内部的环境进行了共享,本地文件修改之后,打开网页能立即看到被修改后的内容..

文件目录下

index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <title>home</title>
</head>
<body>
  <nav>
    <ul>
      <li><a href="/">home</a></li>
      <li><a href="/about.html">about</a></li>
    </ul>
  </nav>
  home
</body>
</html>

home.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>about</title>
</head>
<body>
  <nav>
    <ul>
      <li><a href="/">home</a></li>
      <li><a href="/about.html">about</a></li>
    </ul>
  </nav>
  about
</body>
</html>

image image

开发模式下觉得ok,可以将当前运行环境+集成操作的抽象 => 制作成image镜像,以供随时将其跑成container运行起来..

一张图讲解docker,图里面区分了docker四重境界

image