docker是一种轻量级的虚拟化技术,可以将开发环境同时打包到镜像。跟虚拟机一样,可以虚拟出一个环境,但是虚拟机是虚拟硬件,虚拟出整个操作系统,而docker利用的就是本机的硬件、采用的是进程级别的虚拟环境。所以相对来说,docker会更加轻量级、会更快。
以前我们开发的时候,只需将我们的jar或者war包打包给运维,再给运维一份运行环境的所需配置清单、让运维自己去安装。这个时候就出现很多问题、1.比如我现在又想多布一台机器,那么这些开发环境又要重新搭建 2 .安装的环境版本还必须一致,稍有不慎,就会出现运维那边说“我怎么跑不起来啊,是不是你写的代码有bug啊”,开发又说“怎么可能,我这电脑上跑的好好的,肯定是你的问题啊”,开发运维就互相扯皮,就会延缓整个项目进度。所以这个时候docker就解决了这样的问题,docker可以直接将开发环境结合代码一起打包成一个镜像,开发可以直接将镜像扔给运维,运维只要在linux上安装了docker,就可以直接将镜像跑成容器,就可以直接运行起来,并且再想多布一台机器的时候,也只需要这个镜像就好了。
镜像:镜像包括程序代码、资源、配置文件。
容器:docker把镜像跑起来就是一个容器,一个镜像可以创建多个容器实例。每个容器都是互相隔离的、安全的平台。我们可以把每一个容器看成一个轻量级的linux系统
镜像仓库:远程集中存放镜像的仓库地址。用户创建完镜像后,可上传到公有仓库或者私有仓库,需要在另一台主机上使用该镜像的时候可以拉取下来。
docker采用C/S架构,docker守护进程作为Server端接受Client端的请求,并负责创建、运行、分发docker容器。
启动docker:
systemctl start docker
关闭docker:
systemctl stop docker
重启docker:
systemctl restart docker
查看docker状态:
systemctl status docker
设置开机启动docker:
systemctl enable docker
查看docker帮助:
docker --help
docker 具体命令 --help
docker images
罗列出本地的所有镜像
docker images -a
docker images -q
options说明:
-a:罗列出所有镜像,包括历史镜像
-q:只显示镜像ID
docker search mysql:5.7.0
从远程仓库搜索mysql版本5.7.0的镜像
dicker search --limit 5 mysql:5.7.0
options说明:
–limit n:限制搜索结果n条
docker pull redis:6.0.8
从远程仓库拉取redis版本是6.0.8的镜像到本地(不加版本默认最新版)
docker system df
查看docker镜像、容器、数据卷所占空间
docker rmi fed7e8sd678
本地删除某个镜像
docker rmi 后面可以是镜像ID,也可以是镜像名称
docker rmi -f $(docker images -q)
docker支持$()传值
docker run -it centos /bin/bash
运行镜像变成容器
options说明:
-it:表示以前台方式运行容器,/bin/bash表示启动伪终端
-d:表示以后台方式运行
–name:表示为容器起一个名字,不写代表随机名字
-P:(大写)随机端口映射
-p:(小写)指定端口映射
docker ps -a
罗列出所有的容器
options说明:
-a: 罗列出所有的容器(包括停止的容器)
1.exit
2.ctrl+p+q
当以前台方式运行容器后,怎么退出容器?1.使用exit退出容器,这种方式容器会立即停止运行 2.快捷键ctrl+p+q退出,容器不会停止运行
docker start f6e3ed4sss5
启动已经停止的容器
docker restart 容器ID 重启
docker stop 容器ID 停止
docker kill 容器ID 强制停止
docker rm 容器ID
删除已经停止的容器
docker exec -it 容器ID
docker attach -it 容器ID
区别:
1.docker exec -it 容器ID 会进入容器后重新打开一个cmd新窗口,使用exit退出不会影响容器运行,不会让容器停止。
2.docker attach -it 容器ID 会进入容器使用原来的cmd窗口,使用exit退出会使容器停止
7.docker cp 容器ID:容器内路径 主机上路径
docker在运行容器时,容器会产生数据,如果我们一步小心删除了容器,那么数据就不能恢复了,容器卷技术就是防止数据被误删除,容器卷能把容器内的目录挂载到主机内的目录,实现目录里的数据一致性
docker run -it --privileged=true -v /主机内的目录:/容器内的目录 镜像ID
–privileged=true:代表开启最高权限(不然主机内的目录没有权限)
-v: 挂载目录
如果要实现容器内目录只读,只能通过主机更改(ro:read only)
docker run -it --privileged=true -v /主机内的目录:/容器内的目录:ro 镜像ID
docker run -it --privileged=true --volumes-from 容器名称 现在要运行的镜像ID
–volumes-from: 要继承的容器名称
当我们自己制作镜像的时候,会运行一个容器,然后再容器上操作之后,再docker commit 生成一个自己的镜像。但是有些时候我们的操作十分多,比如在linux内核上安装了vim命令,安装了mysql、redis,十分复杂,当我们下次还要制作这个镜像的时候,又会来编写一遍。所以能不能列出一份list清单呢?DockerFile就是这样的清单。
FROM:基本上都在DockerFile的第一句话,表示基础镜像,父类镜像
MAINTAINER: 表示作者的著名信息、时间
EXPOSE:对外暴露的端口号
WORKDIR:工作目录,就是当镜像以前台方式运行后,默认进去的目录
ENV:声明一个变量,后面可以用$使用
VOLUME: 容器卷
ADD:将主机内的文件拷贝进镜像目录且自动解压
RUN:容器build的时候要运行的shell命令。
CMD:容器在启动之后要执行的命令。如果DockerFile中有多个CMD指令,那么只有最后一个生效,而且如果在docker run 后面有参数,那么CMD的指令还会被参数替换。
ENTRYPOINT: 也是在容器在启动之后要执行的命令。但是ENTRYPOINT的指令不会被参数替换,一般ENTRYPOINT配合CMD来传参。
docker build -t 新镜像的名称:tag .
注意点:最后有一个点。
docker网络就是每个容器所运行起来的内部的网络。
docker网络有三种模式
bridge
host
none
什么意思呢?1.桥接模式,docker在安装之后会虚拟Docker_0网卡,而这个网卡可以与容器内的网络一一配对,相当于交换机一样。
2.主机模式,容器会借用宿主机的网卡,实现内外通信、所以如果使用主机模式,就不能指定端口号。
3.none,只是有个名字在,内部的网关和ip地址都没有指定。
查看所有的网络名称
docker network ls
我们启动容器时会默认使用bridge模式,也是使用最多的模式。
我们启动两个容器互相ping是可以ping通的,但是我们平时不可能写死ip,因为容器在停止后再重新启动ip地址会更换。
所以我们尝试
ping 容器名
发现ping不通。
所以我们自定义网络名称
docker network create 网络名称
其实我们自定义网络名称也是使用bridge桥接模式,但是docker内部帮我们维护好了容器名称与ip的对应关系
在启动容器时,指定网络名称之后就可以通过容器名称互相访问了。
docker run -it --net 网络名称 镜像ID
通过上面,如果当容器很多的时候,比如有20个,20个全部都要启动,并且对启动的顺序有要求时,我们一步步去敲命令太麻烦。
于是docker-compose出现,
一键启动所有容器,一键关闭所有容器。
其实就是一个docker-compose.yml配置文件
version: "3"
services:
redis:
image: redis:alpine
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:
用于部署一个 Compose 应用。
默认情况下该命令会读取名为 docker-compose.yml 或 docker-compose.yaml 的文件。
当然用户也可以使用 -f 指定其他文件名。通常情况下,会使用 -d 参数令应用在后台启动。
停止 Compose 应用相关的所有容器,但不会删除它们。
被停止的应用可以很容易地通过 docker-compose restart 命令重新启动。
用于删除已停止的 Compose 应用。
它会删除容器和网络,但是不会删除卷和镜像。
重启已停止的 Compose 应用。
如果用户在停止该应用后对其进行了变更,那么变更的内容不会反映在重启后的应用中,这时需要重新部署应用使变更生效。
用于列出 Compose 应用中的各个容器。
输出内容包括当前状态、容器运行的命令以及网络端口。
停止并删除运行中的 Compose 应用。
它会删除容器和网络,但是不会删除卷和镜像。
停止 Compose 应用相关的所有容器,但不会删除它们。
被停止的应用可以很容易地通过 docker-compose restart 命令重新启动。
用于删除已停止的 Compose 应用。
它会删除容器和网络,但是不会删除卷和镜像。
重启已停止的 Compose 应用。
如果用户在停止该应用后对其进行了变更,那么变更的内容不会反映在重启后的应用中,这时需要重新部署应用使变更生效。
用于列出 Compose 应用中的各个容器。
输出内容包括当前状态、容器运行的命令以及网络端口。
停止并删除运行中的 Compose 应用。
它会删除容器和网络,但是不会删除卷和镜像。