jjnoob

docker简单配置

2018-10-25
jjnoob

飘过。。。

Docker预备知识:

(1)什么是docker?

1,在同一台服务器上同时运行一百个服务器,肯定会被认为是痴人说梦。而在一台服务器上同时运行一千个Docker容器,这已经成为现实。

2,如果说个人主机时代大家比拼的关键是CPU主频的高低和内存的大小,那么在云计算时代,虚拟化技术无疑是整座信息技术大厦最核心的一块基石。

3,Docker是基于Go语言实现的云开源项目,诞生于2013年初。

4,Docker通过对应用组件的封装(packaging)、分发(distribution)、部署(deployment)、运行(runtime)等生命周期的管理,达到应用组件级别的“一次封装,到处运行”。这里的应用组件,既可以是一个Web应用,也可以是一套数据库服务,甚至是一个操作系统或编译器。

(2)Linux容器技术

1,Docker引擎的基础是Linux(Linux containers,LXC)容器。

2,容器有效的将单个操作系统管理的资源划分到孤立的组中,以便更好地在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。

(3)从Linux容器到Docker

1,可以简单地将docker容器理解为一种沙盒(Sandbox)。每个容器内运行一个应用,不同的容器相互隔离,容器之间也可以建立通信机制。容器的创建和停止都十分快速,容器自身对资源的需求也十分有限,远远低于虚拟机。很多时候,甚至直接把容器当作应用本身也没有任何问题。

(4)Docker容器虚拟化的好处

1,按照传统的做法,一旦需要服务器迁移(例如从阿里云迁移到腾讯云),往往需要重新部署和调试。而Docker提供了一种更为聪明的方式,通过容器来打包应用,意味着迁移只需要在新的服务器上启动需要的容器就可以了。

(5)虚拟化与Dokcer

1,虚拟化的核心是对资源进行抽象,目标往往是为了在同一主机上进行多个系统或应用,从而提高系统资源的利用率,同时带来降低成本、方便管理和容错容灾等好处。

2,Docker以及其他容器技术都属于操作系统的虚拟化范畴。

3,Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。

一、Docker安装:

参考Docker官方Debian安装文档 注意将官方源替换成国内源即可

(1)基本概念

Docker 包括三个基本概念 镜像(Image) 容器(Container) 仓库(Repository)

(2)Debian/Ubuntu 安装Docker

由于 apt 源使用 HTTPS 以确保软件下载过程中不被篡改。因此,我们首先需要添加使用 HTTPS 传输的软件包以及 CA 证书

$ sudo apt-get update
$ sudo apt-get install \
     apt-transport-https \
     ca-certificates \
     curl \
     gnupg2 \
     lsb-release \
     software-properties-common

为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥(中科大源)

$ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add -

然后,我们需要向 source.list 中添加 Docker CE 软件源:

$ sudo add-apt-repository \
   "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/debian \
   $(lsb_release -cs) \
   stable"

更新 apt 软件包缓存,并安装 docker-ce

$ sudo apt-get update
$ sudo apt-get install docker-ce

启动 Docker CE

$ sudo systemctl enable docker
$ sudo systemctl start docker

(3) 建立docker用户组

1,建立docker组:

$ sudo groupadd docker

2,将当前用户加入docker组:

$ sudo usermod -aG docker $USER

3,退出当前终端并重新登录,进行如下测试。

(4)测试 Docker 是否安装正确

$ docker run hello-world

attention (5) 国内镜像加速

参考docker官方文档 Ubuntu 16.04+、Debian 8+、CentOS 7 对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

配置加速器之后,如果拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,在命令行执行 docker info,如果从结果中看到了如下内容,说明配置成功

Registry Mirrors:
 https://registry.docker-cn.com/

新增

2019-03-29日更新

docker中国官方镜像地址加速貌似不行了, 可以用中科大的docker加速

{
    "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}

另外添加docker国内加速后,需要重启docker服务 参考

sudo service docker restart

(6) Uninstall Docker CE

1,Uninstall the Docker CE package:

$ sudo apt-get purge docker-ce

2,Images, containers, volumes, or customized configuration files on your host are not automatically removed. To delete all images, containers, and volumes:

$ sudo rm -rf /var/lib/docker

You must delete any edited configuration files manually.

二、使用镜像:

(1)获取镜像,比如:

$ docker pull ubuntu:16.04

(2)以这个镜像为基础启动并运行一个 容器 ,比如:

$ docker run -it --rm \
	ubuntu:16.04 \
	bash

(参数说明:–rm:这个参数是说容器退出后随之将其删除。默认情况下,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 –rm 可以避免浪费空间。)

(3)列出已经下载下来的镜像

$ docker image ls  ("镜像 ID 则是镜像的唯一标识,一个镜像可以对应多个标签")

(4)通过以下命令来便捷的查看镜像、容器、数据卷所占用的空间。

$ docker system df 

(5)列出部分镜像

1,

$ docker image ls ubuntu

2,

$ docker image ls ubuntu:16.04

(6)删除本地镜像

1,通过(长/短)ID删除镜像:

$ docker image rm 501

2,更精确的是使用 镜像摘要(DIGEST)删除镜像。

$ docker image ls --digests
$ docker image rm REPOSITORY@DIGEST  ("REPOSITORY和DIGEST分别取对应的字符串")

(7)利用 commit 理解镜像构成(但是,不要使用 docker commit 定制镜像,定制镜像应该使用Dockerfile来完成)

1,用 nginx 镜像启动一个容器,命名为 webserver,并且映射了 80 端口,这样我们可以用浏览器去访问这个 nginx 服务器http://localhost。(如果webserver不行的话,取名webserverr,避免重复)

$ docker run --name webserver -d -p 80:80 nginx

2,更改默认Nginx欢迎页面的文字

$ docker exec -it webserver bash  ("以交互式终端方式进入 webserver 容器,并执行了 bash 命令")
# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
# exit
  exit

3,将容器保存为镜像

$ docker commit \
    --author "修改作者" \
    --message "修改了默认网页" \
    webserver \
    nginx:v2

4,运行新的镜像,我们命名为新的服务为 web2,并且映射到 81 端口。可以直接访问 http://localhost:81 看到结果

$ docker run --name web2 -d -p 81:80 nginx:v2

(8)使用 Dockerfile 定制镜像

1,在一个空白目录中,建立一个文本文件,并命名为 Dockerfile:

$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile

其内容为:

FROM nginx
    RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

2,构建镜像(不要忘记后面的小点)

$ docker build -t nginx:v3 . 

三、操作容器:

(1)启动、终止容器

1,启动容器:启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。

2,$ docker run ubuntu:14.04 /bin/echo 'Hello world'  ("新建容器并启动,该命令输出一个 “Hello World”,之后终止容器")
3,$ docker run -t -i ubuntu:14.04 /bin/bash  ("该命令启动一个 bash 终端,允许用户进行交互。其中,-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开。在交互模式下,用户可以通过所创建的终端来输入命令")
4,docker container start  ("该命令直接将一个已经终止的容器启动运行")
5,docker container stop ("来终止一个运行中的容器")
6,docker container ls -a ("该命令可以查看所有已经创建的包括终止状态的容器")
7,docker container restart ("该命令会将一个运行态的容器终止,然后再重新启动它")

(2)进入容器

1,在使用 -d 参数时,容器启动后会进入后台。某些时候需要进入容器进行操作,包括使用 docker attach 命令或 docker exec 命令,推荐大家使用 docker exec 命令。 因为从exec进入的容器的stdin中exit,不会导致容器的停止。这就是为什么推荐大家使用 docker exec 的原因。

2,exec 命令后面可以跟多个参数,当 -i -t 参数一起使用时,则可以看到我们熟悉的 Linux 命令提示符。

$ docker run -dit ubuntu
$ docker container ls
$ docker exec -it 69d1 bash

(3)导出和导入

1, $ docker export 7691a814370e > ubuntu.tar  ("导出容器快照到本地文件")
2, $ cat ubuntu.tar | docker import - test/ubuntu:v1.0  ("从容器快照文件中再导入为镜像")
3, $ docker import http://example.com/exampleimage.tgz example/imagerepo  ("也可以通过指定 URL 或者某个目录来导入,成为镜像")

(4)删除容器

1, $ docker container rm  trusting_newton  ("删除一个处于终止状态的容器,如果要删除一个运行中的容器,可以添加 -f 参数")
2, $ docker container prune  ("清理掉所有处于终止状态的容器")

四、访问仓库:

(1)Docker Hub

1,仓库(Repository)是集中存放镜像的地方。一个容易混淆的概念是注册服务器(Registry)。实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。例如对于仓库地址 dl.dockerpool.com/ubuntu 来说,dl.dockerpool.com 是注册服务器地址,ubuntu 是仓库名。

2,Docker 官方维护了一个公共仓库 Docker Hub

3,在 https://cloud.docker.com 免费注册一个 Docker 账号

4,docker login ("在命令行界面登录 Docker Hub")
5,docker logout ("退出登录")
6, $ docker search centos  ("查找官方仓库中的镜像")
7, $ docker pull centos  ("下载官方 centos 镜像到本地")
8, ("用户也可以在登录后通过 docker push 命令来将自己的镜像推送到 Docker Hub ")
   $ docker tag ubuntu:17.10 username/ubuntu:17.10  ()
   $ docker image ls
   $ docker push username/ubuntu:17.10
   $ docker search username

(2)私有仓库

1, $ docker run -d -p 5000:5000 --restart=always --name registry registry ("安装运行 docker-registry,可以通过获取官方 registry 镜像来运行")
2, $ docker image ls   ("先在本机查看已有的镜像")
3, $ docker tag ubuntu:latest 127.0.0.1:5000/ubuntu:latest ("使用 docker tag 将 ubuntu:latest 这个镜像标记为 127.0.0.1:5000/ubuntu:latest")
4, $ docker push 127.0.0.1:5000/ubuntu:latest  ("使用 docker push 上传标记的镜像")
5, $ curl 127.0.0.1:5000/v2/_catalog  ("用 curl 查看仓库中的镜像")
6, $ docker image rm 127.0.0.1:5000/ubuntu:latest  ("先删除本地已有镜像")
7, $ docker pull 127.0.0.1:5000/ubuntu:latest  ("再尝试从私有仓库中下载这个镜像")  

五、Docker 三剑客之 Docker Compose:

(1)Docker Compose安装

1,我们知道使用一个 Dockerfile 模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排。服务编排有很多种技术方案,今天给大家介绍 Docker 官方产品 Docker Compose

2,安装方法一:(推荐)

$ sudo curl -L https://github.com/docker/compose/releases/download/1.20.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose ("下载")
$ chmod +x /usr/local/bin/docker-compose  ("安装")
$ docker-compose version  ("查看版本")

3,安装方法二:

$ pip install --upgrade pip  ("更新pip")
$ pip install docker-compose  ("安装")
$ docker-compose version  ("查看版本")

4,安装补全工具

$ yum install bash-completion ("安装") 
$ curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose  ("下载docker-compose脚本")

(2)例子快速上手

1,设计这么一个场景,使用 Python 启动一个 Web 服务,输出一个hello()方法,每次访问的时候在 Redis 缓存中进行计数,并且将统计的结果打印到页面中。

2,第一步,创建 Python 服务

$ mkdir composetest
$ cd composetest 
$ emacs app.py

输入以下内容:

import time
import redis
from flask import Flask


app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)


def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)


@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)
$ emacs requirements.txt

输入以下内容:

flask
redis

3、第二步,创建 Dockerfile

$ emacs Dockerfile

输入以下内容:

FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"] 

4,第三步,使用 Compose 文件定义一个服务

$ emacs docker-compose.yml

输入以下内容:

version: '2'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine" 

5,第四步,使用 Compose 编译启动应用

$ sudo docker-compose up

稍等片刻后在浏览器中访问localhost:5000

6、Docker Compose 常用命令 使用docker-compose up -d在后台启动服务 使用docker-compose ps命令查看启动的服务 使用docker-compose stop停止服务

六、Docker 三剑客之 Docker Machine :

(1)Docker Machine负责在多种平台上快速安装 Docker 环境。

(2)安装

$ sudo curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` > /usr/local/bin/docker-machine
$ sudo chmod +x /usr/local/bin/docker-machine 
$ docker-machine -v  ("查看版本信息")

(3)使用

$ docker-machine ls  ("查看是否存在可用的主机")
$ docker-machine create --driver virtualbox default  ("创建一个主机")
$ docker-machine env default  ("创建主机成功后,可以通过 env 命令来让后续操作对象都是目标主机")
$ docker-machine ssh default  ("可以通过 SSH 登录到主机")

七、Docker 三剑客之 Docker Swarm:

(1)Docker Swarm用于搭建Docker集群

(2)创建 Swarm 集群

$ docker-machine create -d virtualbox manager  ("首先创建一个 Docker 主机作为管理节点")
$ docker-machine ssh manager   ("登陆管理节点")
$ docker swarm init --advertise-addr 192.168.99.100  ("我们使用 docker swarm init 在管理节点初始化一个 Swarm 集群")
$ docker-machine create -d virtualbox worker1  ("加工作节点worker1")
$ docker-machine ssh worker1 
$ docker swarm join \
    --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
    192.168.99.100:2377   ("将这段字符串替换成创建管理节点时输出的那段字符串")
$ docker node ls ("在管理节点使用 docker node ls 查看集群")

(3)部署服务

1,新建服务

$ docker-machine ssh manager  ("进入管理节点") 
$ docker search alpine ("使用 docker 中国镜像步骤1")
$ docker pull registry.docker-cn.com/library/alpine ("使用 docker 中国镜像步骤2")
$ docker service create --replicas 1 --name helloworld alpine ping ityouknow.com  ("在已经创建的 Swarm 集群中运行一个名为 helloworld 服务")
$ docker service ps rwpw7eij4v6h6716jvqvpxbyv  ("查看服务进展") 
$ docker service ls  ("查看当前 Swarm 集群运行的服务")

2,监控集群状态

$ docker-machine ssh manager  ("登陆管理节点") 
$ docker service inspect --pretty helloworld  ("查询服务概要状态") 
$ docker service inspect helloworld  ("查询服务详细信息")
$ docker service ps helloworld  ("查看某个服务的详情")
$ docker-machine ssh  worker1 ("在工作节点查看任务的执行情况") 
$ docker ps ("在工作节点查看容器的运行状态") 

3,服务伸缩

$ docker service scale helloworld=5 ("扩展服务运行的容器数量")
$ docker service ps helloworld ("查看扩展后节点运行的情况")
$ docker service scale helloworld=2 ("减少服务运行的容器数量") 
$ docker service ps helloworld ("查看收缩后节点运行的情况")
$ docker service rm helloworld  ("从 Swarm 集群移除某个服务")

END

Thanks!

https://yeasy.gitbooks.io/docker_practice/

https://www.cnblogs.com/ityouknow/p/8520296.html

Docker Documentation

《Docker技术入门与实践》


上一篇 linux基础命令

Content