- 飘过。。。
- Docker预备知识:
- 一、Docker安装:
- 二、使用镜像:
- 三、操作容器:
- 四、访问仓库:
- 五、Docker 三剑客之 Docker Compose:
- 六、Docker 三剑客之 Docker Machine :
- 七、Docker 三剑客之 Docker Swarm:
飘过。。。
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技术入门与实践》