may the force be with you
Docker使用分享
1.什么是 docker
- Docker是一个开源的应用容器引擎,基于Go语言并遵从Apach2.0协议开源。
- Docker可以让开发者打包他们的应用以及依赖包包到一个轻量级,可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
为什么使用Docker:
- Docker是世界领先的软件容器平台
- 自动执行重复性人物,构建接触的软件
- 用户方便创建和使用容器
- 运行环境的一致性。
- 秒级,毫秒级的启动时间
- 避免公用的服务器,资源受其他用户影响 – 隔离性
- 弹性伸缩,快速扩建(服务忙闲不均,资源浪费)
- 迁移方便
- 持续交付和部署
2.云计算+大数据时代
- IaaS(Infrastructure as a Service:基础设施即服务)
提供服务器,需要开发一套代码,安装开发环境- PaaS(Platform-as-a-Service:平台即服务)
提供服务器和安装环境,需要开发一套代码- SaaS(Software as a Service:软件即服务)
提供服务器,开发环境,代码,只需要花钱
Docker compare VM
3.docker 架构
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
Docker | 面向对象 |
---|---|
容器 | 对象 |
镜像 | 类 |
4.docker install
docker install document: https://docs.docker.com/engine/install/centos/.
- CentOS 系统的内核版本高于 3.10
uname -r- 升级yum
sudo yum update- 卸载旧版本
sudo yum remove docker docker-common docker-selinux docker-engine- 安装需要的软件包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2- 设置yum源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo- 查看仓库中所有docker版本
yum list docker-ce --showduplicates | sort -r
- 安装docker
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
- 启动并加入开机启动
sudo systemctl start docker
sudo systemctl enable docker- 验证安装是否成功
sudo docker version
- 守护进程重启
sudo systemctl daemon-reload- 重启docker服务
sudo systemctl restart docker- 测试是否正确安装
sudo docker run hello-world
- 测试
sudo docker images
sudo docker ps -a
- docker 仓库
官网链接: https://hub.docker.com/.
5.sudo docker
使用docker的过程中,很多情况下都需要root权限才可以
- 添加docker组,一般已存在
sudo groupadd docker- 将登陆用户添加到docker组在
sudo gpasswd -a xxxx docker- 更新用户组
newgrp docker- 测试
docker version
- 或者一步到位
sudo usermod -aG docker xxxx
6.configuration docker mirror
添加阿里云/中科大镜像,操作如下:
cd /etc/docker
sudo vim daemon.json
{
"registry-mirrors": ["https://ustc-edu-cn.mirror.aliyuncs.com"]
}
{
"registry-mirrors": ["https://gxeo3yz7.mirror.aliyuncs.com"]
}
- 依次执行以下命令
sudo systemctl daemon-reload
sudo systemctl restart docker
7.docker image
- 显示镜像
docker images/docker image ls- 拉去镜像/版本
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker pull tomcat / docker pull tomcat:8- 搜索镜像
docker search tomcat- 删除镜像(id,name)
docker rmi tomcat
8.docker container
- 显示正在运行的容器
docker ps- 显示正在运行过的容器历史记录
docker ps -a
- 基于镜像创建一个容器并启动
-i:保持和docker容器内的交互,启动容器时,运行的命令结束后,容器依然存活,没有退出。
-t:为容器的标准输入虚拟一个tty。
-d:守护进程,后台运行容器。
–rm:容器启动后,执行完成命令或传给你续后销毁。
–name:给容器自动以名称。
-p:内部端口。前面是计算机端口,后面是docker内部端口
docker run -d --name tomcat-8080 -p 8080:8080 tomcat- 停掉所有容器
docker stop $(docker ps -a -q)- 停掉某个容器
docker stop id/name- 启动某个容器
docker start id/name
- 删除某个容器/强制
docker rm tomcat/docker rm -f tomcat- 删除所有容器
docker rm $(docker ps -a -q)
- linux开通防火墙
firewall-cmd --list-ports
firewall-cmd --zone=publish --add-port=8080/tcp --permanent
firewall-cmd --zone=publish --add-port=8081/tcp --permanent
firewall-cmd --reload
9.docker inner
- 进入容器内部
docker exec -it CONTAINER_ID bash
docker exec -it CONTAINER_ID /bin/bash- 退出容器
exit- 将容器的东西复制到宿主机
docker cp containerName:path targetPath
将html复制到宿主机的home下面
docker cp tomcat_8081:/usr/local/tomcat/webapps/index.html /home
将html复制到docker container下面
docker cp index.html tomcat_8081:/usr/local/tomcat/webapps
- 查看容器的操作系统
cat /etc/issue
- Alpine Linux
1.更新本地宝版本
apk update
2.安装vim
apk add vim- CentOS
yum -y install vim- Ubuntu
1.更新本地宝版本
apt-get update
2.安装vim
apt-get install vim
10.docker log
docker logs [options] 容器
获取容器的日志。
名字 | 默认值 | 描述 |
---|---|---|
--details | 显示提供给日志的额外细节 | |
--follow或-f | 按日志输出 | |
--since | 从某个时间开始显示,例如2013-01-02T13:23:37 | |
--tail | all | 从日志末尾多少行开始显示 |
-t | 显示时间戳 | |
--until | 打印某个时间以前的日志,例如 2013-01-02T13:23:37 |
- 查看指定时间后的⽇志,只显⽰最后100⾏
docker logs -f -t --since=“2018-02-08” --tail=100 CONTAINER_ID- 查看最近30分钟的⽇志
docker logs --since 30m CONTAINER_ID- 查看某时间之后的⽇志
docker logs -t --since=“2018-02-08T13:23:37” CONTAINER_ID- 查看某时间段⽇志
docker logs -t --since=“2018-02-08T13:23:37” --until “2018-02-09T12:23:37” CONTAINER_ID
11.docker 数据卷
数据卷:是一个可供一个或多个容器使用的特殊目录
特性:
- 数据卷可以在容器之间共享和使用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即使容器被删除
数据卷的最大特点:其生存周期独立于容器的生存周期
- 创建数据卷
docker volume create xxxx
默认数据卷会在/var/lib/docker/volumes下
ls -l /var/lib/docker/volumes
用数据卷创建
docker run -d --name tomcat-8080 -p 8080:8080 -v xxxxx:/usr/local/tomcat/webapps/ROOT tomcat
直接path创建
docker run -d --name tomcat-8080 -p 8080:8080 -v /home/xxx/index.html:/usr/local/tomcat/webapps/ROOT tomcat
- 查看数据卷
docker volume inspect xxxx- 查看全部数据卷信息
docker volume ls- 移除数据卷
docker volume rm xxxx
12.docker中的三剑客
docker中的三剑客是指swarm、compose和machine
- compose是用来定义和运行一个或多个容器运行和应用的工具;
- machine是一个简化Docker安装的命令行工具;
- swarm是社区提供的原生支持Docker集群的工具。
12.1 compose
docker compose: https://github.com/docker/compose.
在实际生产环境中,一个应用往往由许多服务构成,而 docker 的最佳实践是一个容器只运行一个进程,因此运行多个微服务就要运行多个容器。多个容器协同工作需要一个有效的工具来管理他们,定义这些容器如何相互关联。compose 应运而生。
1.下载安装:
docker compose package download: https://github.com/docker/compose/releases.
- 下载
wget https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-linux-x86_64- 移动
mv docker-compose-Linux-x86_64 /usr/local/bin- 改名
mv docker-compose-Linux-x86_64 docker-compose- 改权限
chmod 777 docker-compose- 软链
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose- 版本
docker-compose version
2.compose.yaml
- 术语
服务(service):一个应用容器,实际上可以运行多个相同镜像的实例
项目(project):由一个关联的应用容器组成的一个完成业务单元
如果使用build指令,在Dockerfile中设置的选项(例如:CMD,EXPOSE,VOLUME,ENV等)将自动被获取,无需在docker-compose.yml中再次被设置。
docker compose config: https://www.runoob.com/docker/docker-compose.html.
1.image
指定为镜像名称或镜像ID。如果镜像不存在,Compose将尝试从互联网拉取这个镜像2.build
指定Dockerfile所在文件夹的路径。Compose将会利用他自动构建这个镜像,然后使用这个镜像。 build: ./dir
3.command
覆盖容器启动后默认执行的命令。 command: bundle exec thin -p 3000
4.links
链接到其他服务容器,使用服务名称(同时作为别名)或服务别名(SERVICE:ALIAS)都可以
links: - db - db:database - redis
注意:使用别名会自动在服务器中的/etc/hosts 里创建,如:172.17.2.186 db,相应的环境变量也会被创建。
5.external_links
链接到docker-compose.yml外部的容器,甚至并非是Compose管理的容器。参数格式和links类似。
external_links: - redis_1 - project_db_1:mysql - project_db_2:sqlserver
6.ports
暴露端口信息。 宿主机器端口:容器端口(HOST:CONTAINER)格式或者仅仅指定容器的端口(宿主机器将会随机分配端口)都可以。
ports: - "3306" - "8080:80" - "127.0.0.1:8090:8001"
注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 你可能会得到错误得结果,因为 YAML 将会解析 xx:yy 这种数字格式为 60 进制。所以建议采用字符串格式。
7.expose
暴露端口,与posts不同的是expose只可以暴露端口而不能映射到主机,只供外部服务连接使用;仅可以指定内部端口为参数。
expose: - "3000" - "8000"
8.volumes
设置卷挂载的路径。可以设置宿主机路径:容器路径(host:container)或加上访问模式(host:container:ro)ro就是readonly的意思,只读模式。
volumes: - /var/lib/mysql:/var/lib/mysql - /configs/mysql:/etc/configs/:ro
9.volunes_from
挂载另一个服务或容器的所有数据卷。
volumes_from: - service_name - container_name
10.environment
设置环境变量。可以属于数组或字典两种格式。 如果只给定变量的名称则会自动加载它在Compose主机上的值,可以用来防止泄露不必要的数据。
environment: - RACK_ENV=development - SESSION_SECRET
11.env_file
从文件中获取环境变量,可以为单独的文件路径或列表。 如果通过docker-compose -f FILE指定了模板文件,则env_file中路径会基于模板文件路径。 如果有变量名称与environment指令冲突,则以后者为准。
env_file: .env env_file: - ./common.env - ./apps/web.env - /opt/secrets.env
环境变量文件中每一行都必须有注释,支持#开头的注释行。
# common.env: Set Rails/Rack environment RACK_ENV=development
12.extends
基于已有的服务进行服务扩展。例如我们已经有了一个webapp服务,模板文件为common.yml.
# common.yml webapp: build: ./webapp environment: \ - DEBUG=false \ - SEND_EMAILS=false
编写一个新的 development.yml 文件,使用 common.yml 中的 webapp 服务进行扩展。 development.yml
web: extends: file: common.yml service: webapp: ports: \ - "8080:80" links: \ - db envelopment: - DEBUG=true db: image: mysql:5.7
后者会自动继承common.yml中的webapp服务及相关的环境变量。
13.net
设置网络模式。使用和docker client 的 --net 参数一样的值。
# 容器默认连接的网络,是所有Docker安装时都默认安装的docker0网络. net: "bridge" # 容器定制的网络栈. net: "none" # 使用另一个容器的网络配置 net: "container:[name or id]" # 在宿主网络栈上添加一个容器,容器中的网络配置会与宿主的一样 net: "host"
Docker会为每个节点自动创建三个网络: 网络名称 作用 bridge 容器默认连接的网络,是所有Docker安装时都默认安装的docker0>网络 none 容器定制的网络栈 host 在宿主网络栈上添加一个容器,容器中的网络配置会与宿主的一样 附录:操作名称 命令 创建网络 docker network create -d bridge mynet 查看网络列表 docker network ls
14.pid
和宿主机系统共享进程命名空间,打开该选项的容器可以相互通过进程>id来访问和操作。
pid: class="hljs-string">"host"
15.dns
配置DNS服务器。可以是一个值,也可以是一个列表。 dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9
16.cap_add,cap_drop
添加或放弃容器的Linux能力(Capability)。
cap_add: - ALL cap_drop: - NET_ADMIN - SYS_ADMIN
docker-compose.yml实例
version: "3.0"
services:
redis:
restart: always #docker启动,容器就跟着启动
image: redis:alpine
container_name: redis
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- 5000:80
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
result:
image: dockersamples/examplevotingapp_result:before
ports:
- 5001:80
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints: [node.role == manager]
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
frontend:
backend:
volumes:
db-data:
启动执行:docker-compose up -d
非默认文件名启动执行:docker-compose -f xxx.xxx up -d
关闭执行:docker-compose stop
12.2 machine
ocker Machine 是一个简化Docker 安装的命令行工具。通过一个简单的命令行即可在相应的平台上安装 Docker,为用户提供了灵活的功能,使得用户可以在任一主机上运行 Docker 容器。简单说,一个 Docker Machine 就是一个 Docker host 主机和经过配置的 Docker client 的结合体。
技术上讲, Machine 是一个框架,比较开放。对于任何提供虚拟机服务的平台,只要在这个框架下开发针对该平台的驱动,,Docker Machine 就可以集成到该平台,在该平台上执行创建、删除、启动、停止等行为。
12.3 swarm
Swarm 是 Docker 社区提供的原生支持 Docker 集群的工具。 它可以把多个 Docker 主机组成的系统转换成为单一的虚拟 Docker 主机。Swarm 对外提供两种 API。
- 一种是标准的 Docker API,例如 Dokku、Compose、Krane、Flynn、Deis、Jenkins等;
- 另一种是 Swarm 的集群管理 API,用于集群的管理。
13.docker定制镜像
- 从已经存下的容器中更新镜像,并提交
- 使用dockerfile指令来创建一个新的镜像
DockerFile template/centos
FROM centos
MAINTAINER xxxx<nolan@163.com>
ENV JAVA_HOME /usr/local/jdk_1.8/
WORKDIR /usr/local
RUN yum install -y vim
RUN yum install -y net-tools
EXPOSE 8080
CMD echo $JAVA_HOME
CMD echo "---end---"
CMD /bin/bash
指令 | 语法 | 说明 |
---|---|---|
FROM | FROM : | 指明构建的新镜像是来自于哪个基础镜像,如果没有选择tag,那么默认值为latest |
MAINTAINER | MAINTAINER | 指明镜像维护者及其联系方式(一般是邮箱地址)。官方说明已过时,推荐使用LABEL |
LABEL | LABEL = … | 功能是为镜像指定标签。也可以使用LABEL来指定镜像作者 |
RUN | RUN | 构建镜像时运行的Shell命令,比如构建的新镜像中我们想在/usr/local目录下创建一个java目录 |
ADD | ADD … | 拷贝文件或目录到镜像中。src 可以是一个本地文件,还可以是一个url。然后自动下载和解压 |
COPY | COPY … | 拷贝文件或目录到镜像中。用法同 ADD,只是不支持自动下载和解压 |
EXPOSE | EXPOSE [/…] | 暴露容器运行时的监听端口给外部,可以指定端口是监听 TCP 还是 UDP,如果未指定协议,则默认为 TCP |
ENV | ENV = … | 设置容器内环境变量 |
CMD | CMD [“executable”,“param1”,“param2”] | 启动容器时执行的Shell命令。在Dockerfile中只能有一条CMD指令。如果设置了多条CMD,只有最后一条会生效 |
ENTRYPOINT | ENTRYPOINT [“executable”, “param1”, “param2”] | 启动容器时执行的 Shell 命令,同 CMD 类似,不会被 docker run 命令行指定的参数所覆盖,如果设置了多条ENTRYPOINT,只有最后一条会生效 |
WORKDIR | WORKDIR param | 为 RUN、CMD、ENTRYPOINT 以及 COPY 和 AND 设置工作目录 |
VOLUME | VOLUME [“param”] | 指定容器挂载点到宿主机自动生成的目录或其他容器。一般的使用场景为需要持久化存储数据时 |
-t:构建镜像的名称
最后面的点:表示同级目录
规范命名Dockerfile:docker build -t mycentos:1.0 .
不规范命名执行:docker build -f xxxxx -t mycentos:1.0 .
14.docker开启远端访问
1.修改docker.service
#进入配置文件
vim /etc/systemd/system/docker.service
#找到下面的命令
ExecStart=/usr/local/bin/dockerd
#修改为
ExecStart=/usr/local/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
2.重启docker
systemctl daemon-reload
systemctl restart docker
3.curl访问
curl http://localhost:2375/version
4.通过 http 访问
http://xx.xx.xx.xx:2375/version
15.docker自启,container自启
- docker开机启动
systemctl enable docker
- 创建容器时自启
--restart具体参数值详细信息:
- no // 默认策略,容器退出时不重启容器;
- on-failure // 在容器非正常退出时(退出状态非0)才重新启动容器;
- on-failure:3 // 在容器非正常退出时重启容器,最多重启3次;
- always // 无论退出状态是如何,都重启容器;
- unless-stopped // 在容器退出时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了的容器。
- docker run -d --restart=always --name containerName -p port imageName
docker run -d --restart=always --name tomcat-8080 -p 8080:8080 tomcat- 更新设定
docker update --restart=always containerId/containerName