Docker入门
Posted SAP Basis
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker入门相关的知识,希望对你有一定的参考价值。
容器主要内容:
1 初步了解概念
2 构建image镜像
3 Service
4 Swarm
5 Stack
1 初步了解概念
什么是Docker:https://www.docker.com/what-docker
为什么用Docker(用户案例): https://www.docker.com/use-cases
先大致了解几个概念:image镜像、container容器、 Repository库、 Service服务、Task任务、stack堆叠、swarm群集
image镜像是一个只读模板,里面包含了完整的系统环境、应用程序和数据,可以理解为打包好的一个包
container容器是image的一个实例,可以启动,停止,删除,将image载入内存跑起来就是一个container,可以将其理解为一台机器,但是这个机器不能单独存在,需要依赖于一个操作系统。
Repository库为存image的地方,每个image镜像用标签tag区分
Task任务:如果一个image只运行了一个container,这个正在运行中的container就可以看作是一个任务。
Service服务:可以理解为镜像的运行方式:使用哪个端口,运行多少个副本(replicas)CPU和内存的限制,使用哪种文件系统,副本挂掉之后的处理方式等等,一个服务只运行一个镜像。
stack堆叠:多个任务组合到一起就是一个Stack堆叠
Swarm群集:一个或者多个主机(可以是物理机也可以是虚拟机)组成一个Swarm集群
docker的安装见:http://www.cnblogs.com/detu/p/Docker-Installation.html
下面我们进一步了解。
2 构建image镜像
2.1 通过文件搭建自己的image 镜像
通过文件 Dockerfile来构建image
建立自己的image
建立空目录
cd /tmp
mkdir hello
vi Dockerfile
vi requirements.txt
vi app.py
这三个文件的内容见 https://docs.docker.com/get-started/part2/#apppy
docker build -t friendlyhello .
#注意 最有有一个点
#friendlyhello是取的名字,当然也可以用其他名字
构建完之后image就生成并保存在本地
利用命令 docker image ls 查看
node1:/tmp/hello # docker image ls
friendlyhello latest 00422a9450a8 8 hours ago 150 MB
2.2 运行镜像
用参数 -p将容器的80端口映射成主机的4000端口
docker run -p 4000:80 friendlyhello
或者用curl 查看
curl http://localhost:4000
运行 Ctrl+C 关闭
后台运行
加上参数 -d在后台运行:
docker run -d -p 4000:80 friendlyhello
这时想要结束需要用docker container stop < CONTAINER ID >
先查看CONTAINER ID
docker container ls
CONTAINER ID IMAGE COMMAND CREATED
b5c44054f916 friendlyhello "python app.py" 28 seconds ago
结束运行:docker container stop b5c44054f916
2.3 共享镜像
上传image到docker云上。
先登录docker cloud建立一个库
我这里建立了一个 teslade/hello的库
标记image名字 docker tag image username/repository:tag
如:docker tag friendlyhello teslade/hello:part1
docker login
然后将image推到云上docker push username/repository:tag
如:docker push teslade/hello:part1
3 Service
3.1 基本概念
“服务”包含着这些信息:使用哪个端口,运行多少个副本(replicas)CPU和内存的限制,使用哪种文件系统,副本挂掉之后的处理方式等等,一个服务只运行一个镜像。
3.2 利用yml文件编排service服务
docker通过yml文件来编排这些服务
新建一个yml文件
vi docker-compose.yml
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: username/repo:tag
deploy:
replicas: 5
#运行5个实例
resources:
limits:
cpus: "0.1"
#CPU限制最高为10%
memory: 50M
#内存限制最高为50M
restart_policy:
condition: on-failure
#如果运行失败立即重启
ports:
- "80:80"
#容器的80端口映射为主机的80端口
networks:
- webnet
networks:
webnet:
在运行之前先运行docker swarm init (目的为建立一个集群,在这里为单节点集群)
运行:docker stack deploy -c docker-compose.yml <appname>
<appname>为给这次运行起个名字
如:docker stack deploy -c docker-compose.yml getstartedlab
运行后查看服务
docker service ls
得到ID之后查看具体信息,可以看到该服务的所有节点(副本)因为在配置文件docker-compose.yml中设置了五个任务(task)replicas: 5 所以可以看到运行了5个
每个副本(任务task)都有一个容器与之对应。
查看每一个副本的ID 命令为 docker service ps <service ID>
可以查看每一个任务的具体信息
docker inspect <task ID>
在这里限定格式只输出完整容器的ID
docker inspect --format=\'{{.Status.ContainerStatus.ContainerID}}\' <Task ID>
如:docker inspect --format=\'{{.Status.ContainerStatus.ContainerID}}\' gdqkw5kbr89l
反之,可以通过容器的ID去查看任务ID
先查看容器ID docker container ls 然后根据容器ID查看任务ID
docker inspect --format="{{index .Config.Labels \\"com.docker.swarm.task.id\\"}}" <container ID>
如docker inspect --format="{{index .Config.Labels \\"com.docker.swarm.task.id\\"}}" ba6c19458795
docker container ls -q 只列出容器ID
3.3 扩展服务应用
通过通过改文件docker-compose.yml中replicas的值来改变运行的任务副本(同时容器的数量随之改变,有多少个任务就有多少个容器)改完值之后保存,重新运行docker s
tack deploy -c docker-compose.yml getstartedlab 此时会更新运行的容器。再次用命令docker container ls -q查看运行的容器
3.4 停止服务
执行命令docker stack rm <appname>
如:docker stack rm getstartedlab
swarm还在运行
docker node ls
关闭swarm: docker swarm leave --force
4 Swarm
4.1 简介
Swarm是Dockerd 集群(主机的集群),集群中的机器可以是物理机也可以是虚拟机,第一个加入的为管理节点。
4.2 配置Swarm集群
需要至少准备两台机器,这里准备了两台虚拟机node1和node2
在第一台虚拟机上运行命令 docker swarm init 进行初始化,这个节点自动成为管理节点
在第二台节点上运行
docker swarm join \\
--token <token> \\
<ip>:<port>
如图:
token的内容由管理节点给出
加入后查看节点
在节点1上部署服务(Service)实际为部署一个stack(包含多个service)
4.3 在Swarm集群上部署服务
执行docker stack deploy -c docker-compose.yml getstartedlab
docker stack ps getstartedlab
可以看到这5个副本任务(task)分布在两个节点上,对应的容器也分布在两台机器上,执行docker container ls查看
可以看到node1上运行了两个容器
节点node2运行了三个容器
其中 docker stack ls; docker service ls ; docker node ls这几个命令只能在管理节点上运行。
到浏览器上浏览 http://localhost或者执行curl http://localhost
4.4 调整应用:
只需要更改docker-compose.yml的内容,然后重新执行docker stack deploy -c docker-compose.yml getstartedlab即可。
如果需要新增节点,只需要在节点上执行以下命令
docker swarm join \\
--token <token> \\
<ip>:<port>
然后再执行docker stack deploy -c docker-compose.yml getstartedlab重新部署即可。
节点脱离集群,执行docker swarm leave
关闭管理节点执行:
docker swarm leave --force
5 Stack
5.1 简介
Stack是几个service服务的集合,在yml文件中中可以编排多个service
5.2 部署stack
我们现在按照https://docs.docker.com/get-started/part5/ 的内容修改yml文件
version:"3"
services:
web:
# replace username/repo:tag with your name and image details
#替换成自己的镜像名
image:
username/repo:tag
deploy:
replicas:
5
restart_policy:
condition:
on-failure
resources:
limits:
cpus:
"0.1"
memory:
50M
ports:
-
"80:80"
networks:
-
webnet
visualizer:
image:
dockersamples/visualizer:stable
ports:
-
"8080:8080"
volumes:
-
"/var/run/docker.sock:/var/run/docker.sock"
#需要访问主机的分区
deploy:
placement:
constraints:
[node.role == manager]
#表示只能运行在管理节点上
networks:
-
webnet
networks:
webnet:
重新运行docker stack deploy -c docker-compose.yml getstartedlab
到主机上访问http://localhost:8080/
查看正在运行的stack
docker stack ls
查看更详细的信息 docker stack ps <stack ID>
查看service:
docker service ls
5.3 保存数据到主机
保存运行过程中产生的数据到主机
在主机上保存容器运行的数据
编辑yml文件
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
#改成自己的镜像名
image: username/repo:tag
deploy:
replicas: 5
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
ports:
- "80:80"
networks:
- webnet
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
- webnet
redis:
image: redis
ports:
- "6379:6379"
volumes:
- /home/docker/data:/data
#将/home/docker/data挂在为容器的/data
deploy:
placement:
constraints: [node.role == manager]
command: redis-server --appendonly yes
networks:
- webnet
networks:
webnet:
redis运行时可以记录访问量,要使之能够访问主机的数据并保存下来。
到/home/docker下创建data目录
重新部署stack
docker stack deploy -c docker-compose.yml getstartedlab
再访问http://localhost 可以看到redis工作并计数
以上是关于Docker入门的主要内容,如果未能解决你的问题,请参考以下文章
Docker删除报错:Error response from daemon: conflict: unable to delete 08b152afcfae (must be forced)(代码片段
markdown [Docker] Docker片段列表和命令#linux #docker #snippets