Docker使用手册

字数 2484阅读 1837

学习途径

  • docker官网教程(学习一样新东西最快的方法是去看官方文档,讲解的清楚,教程简单,但是包括的面十分的广,只记录自己觉得有用的命令,详细请去官网查看Docker start)
  • 在docker的学习过程中我也其中也发现一篇很好的教程,简洁明了,我也在这里学到了很多,也摘录总结在了这里,推荐大家去Docker--从入门到实践进行学习。也可以fork那个项目下来进行贡献。如果网速有问题可以docker一个,直接本地访问(教程提供的方法,我只是搬运一下)
$ docker pull dockerpracticecn/docker_practice

$ docker run -it --rm -p 4000:80 dockerpracticecn/docker_practice

访问127.0.0.1:4000即可

手册内容

Docker的安装(老规矩)

普通安装方式

sudo apt-get update

sudo apt-get install docker.io


但是上面的下载的版本会比较低,所以建议用下面这种方式

sudo apt-get install curl
curl -sSL https://get.docker.com/ | sh

下载完毕启动Docker的守护进程

sudo service docker start

检查Docker是否安装成功(这是运行了一个容器,后面会有解释)

sduo docker run hello-world

如果最终提示Hello from Docker! 如图所示则表明docker安装成功


安装成功提示

Docker试水(初级篇)

10分钟小任务认识Docker
  • 查看版本号

docker version

版本号
  • 查找镜像 (镜像的全称是 <username>/<repository>)

docker search tutorial

或者可以尝试

docker search ubuntu

  • 下载镜像

docker pull learn/tutorial

  • 用docker run来创建和运行docker容器(docker可以创建容器并在容器中运行指定的命令)

docker run learn/tutorial echo "hello world"

  • 查看所有容器(加上 -l 可以查看最新创建的容器)

docker ps

  • 运行并修改容器(给原容器安装ping)

docker run learn/tutorial apt-get install -y ping

  • 通过docker ps -l找出安装过ping包的容器的ID号(-l 是last,找出最新创建的容器)

docker ps -l

查看容器
  • 将安装过ping包的容器提交为新的镜像,这时会返回一个新的ID便是新生成的镜像的ID(意思是把容器打包成镜像,因为平时都是把镜像打开变成容器,这里相当于我们对容器进行了修改,想让更多的人来用,所以我们把我们修改后的容器变成了镜像。镜像易于传播,但是容器不行,)

docker commit {containId} {new image name}
docker commit 09c2e9353f01 yugougou/ping

  • 基于新的镜像创建容器并在容器中执行 ping www.google.com这条指令(新镜像要使用全名 yugougou/ping)

docker run yugougou/ping ping www.google.com

  • 查询容器信息

docker ps 查询所有运行的容器

docker inspect a102 查看单个容器的信息(根据docker ps列出的容器名,选取前三四个字符即可)

  • 新镜像上传仓库

docker images 查询本机的镜像列表

查询结果中有yugoguou/image这个镜像


查询结果

所以把镜像推送到Docker官仓(这里有个权限的要求,要求你要在docker hub上有注册过 并输入用户名密码才可以进行上传)

docker push yugougou/ping

Docker试水 中级篇

创建镜像

首先说明一下 docker中有几个比较重要的概念,『镜像』,『镜像标签』,『容器』,『镜像仓库』,『镜像仓库源』。我简单说下自己的理解。

镜像就是一个模子,我们可以通过这个模子(镜像)来创建成品(容器),相同的模子(镜像)创建的成品(容器)都是一样的,而且不同的模子(镜像)都是有编号(镜像标签)的。我们可以把我们的模子(镜像)放存放到仓库(镜像仓库)中,这样其他人也可以用。而且呢,仓库(镜像仓库)一般都是放在一个大的厂子(镜像仓库源)里来管理的,以此保证我们的模子(镜像)不会因为太多而管理混乱。
所以总结一下就是:我们可以在这个工厂(镜像仓库源)的仓库(镜像仓库)中根据标签(镜像标签)拿到我们需要的模子(镜像),来制作生成我们的成品(容器)。
比如我在生成好自己的镜像并且想要push到镜像仓库的时候,就可以通过地址来看清这几者的关系


docker push index.alauda.cn/alaudaorg/zpyuregis:syncimagealauda


index.docker.io       /yugougou/get-started1    :zpyutestsync
  
 REGISTORY             REPOSITORY                TAG

index.docker.io对应镜像源
/yugougou/get-started1 对应镜像仓库
:zpyutestsync 对应镜像标签

这样我就把自己的镜像push到了dockerhub中用户名为yugougou的get-started1的仓库中,而且为了标识清楚这个镜像,我给这个镜像起的一个名字就是zpyutestsync.


相信通过以上的详细介绍你应该还是没有明白这些概念。。。。,如果真的不明白请再看一遍,如果真的还是不明白,就请动手敲一下代码,接下来我就教大家来创建镜像,启动一个服务,这样应该就会更好的理解了。
现在我们知道了镜像与容器的关系,知道了容器是由镜像run起来的,那么镜像是怎么来的呢,我们可不可以拥有自己的镜像呢,当然可以,通过dockerfile我们就可以来搭建自己的镜像了,我们先创建一下三个文件:

Dockerfile

# Use an official Python runtime as a parent image
FROM python:2.7-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
ADD . /app

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]

requirements.txt

Flask
Redis

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)

创建app(注意有个点)

docker build -t friendlyhello .

找到新建的镜像

$ docker images

REPOSITORY            TAG                 IMAGE ID
friendlyhello         latest              326387cea39

跑起来

docker run -d -p 4000:80 friendlyhello

访问http://localhost:4000即可,这样你就有了一个flask框架的小的web应用程序了,真是TM的吃了一鲸,对的,就是这么快。好的这个过程我们来慢慢分解一下,当然需要你有一些python开发的基础。
先说一下这里我们用到的几个文件,Dockerfile、requirements.txt、app.py,其实里面与镜像构建相关的只有Dockerfile,另外两个文件只是用来让这个demo更炫酷一些而已,其实一个Dockerfile就完全可以制作一个镜像了。我们看下Dockerfile里的内容:

# Use an official Python runtime as a parent image
FROM python:2.7-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
ADD . /app

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]

其实我想如果你英文稍微好一些,应该大概能明白是什么意思,FROM的作用就是说我要做的这个镜像是基于哪个基础镜像的,这里我们的镜像是基于python:2.7-slim这个基础镜像的,所以我们这个镜像里生来就有python的环境啦。


看 我没骗你吧

WORKDIR是说我的工作目录在哪里


image.png

ADD的作用是将现在所在目录下的所有内容复制到当前工作目录下(比如现在的app/)

CMD的意思是说当这个容器准备好了,就执行这个命令,也就是

python app.py

恩 有了这些基本内容你就创建了一个镜像,并且已经把它run起来了,恭喜你呀


分享镜像

自己好不容易创建了一个镜像,想分享一下(就是为了演示昂 这种小破镜像很难会有人真的去分享),肿么办。 好办!这里有个存储镜像的地方,就像github一样,你可以在这上传你的镜像,也可以去下载别人的镜像,他就是docker hub,到这里注册个账号,继续下面的步骤吧。

登录

docker login

打标签

docker tag image username/repository:tag
举个例子
docker tag image yugougou/get-started:part2
这里的于狗狗是你的用户名,get-started是仓库名

公布镜像

docker push username/repository:tag
例如
docker push yugougou/get-started:part2

测试(拉一把 看看能不能跑起来)

docker run -p 4000:80 username/repository:tag
例如一个
docker run -p 4000:80 yugougou/get-started:part2

如果能成功跑起来,那就没什么问题了,恭喜你已经学会简单使用Docker了。

Docker编排工具 Compose

docker对compose的定义就是一种定义和运行多容器应用的工具
(Compose is a tool for defining and running multi-container Docker applications)
说大白话就是,上面咱们做的那个破镜像根本不会有人来用,因为功能单一,不对,因为基本上没什么功能,但是如果要是想要玩个大的,做个功能多的镜像,比如我们要自己弄一个容器化的Gitlab,Gitlab肯定是要依靠数据库的吧,而且也需要个缓存redis,那是不是要一个容器一个容器的慢慢的启动呢,感觉有点麻烦呢,而且如果是稍微大点的容器化平台的公司,可能要管理成千上万个容器,要是需要一个一个手动启停的话,。。。。不敢想。于是docker给咱们一个这样的工具,docker-compose。
大家先创建一个文件,docker-compose.yaml,恩,这是一个yaml文件,yaml文件是一个这样的文件,这是阮一峰的教程,可以看一下。

postgresql:
  image: sameersbn/postgresql:9.4-12
  environment:
    - DB_USER=gitlab
    - DB_PASS=password
    - DB_NAME=gitlabhq_production

redis:
  image: sameersbn/redis:latest

gitlab:
  image: sameersbn/gitlab:8.4.4
  links:
    - redis:redisio
    - postgresql:postgresql
  ports:
    - "18008:80"
    - "18009:22"
  environment:
    - GITLAB_PORT=18008
    - GITLAB_SSH_PORT=18009
    - GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alphaumeric-srting

这个是gitlab的docker-compose文件,只要一行代码,就能让你拥有一个gitlab,

docker-compose up -d

这样就会根据compose的内容去启动容器,会先启动postgresql,redis和gitlab,然后就可以去访问18008这个端口了(当然这个端口你那里可以改成你自己的端口),嗯嗯,好好玩吧

未完待续。。。

推荐阅读更多精彩内容