Docker是一个开源的应用容器引擎,基于Go语言开发。Docker可以让开发者打包他们的应用,
Docker借鉴了标准集装箱的概念。
标准集装箱将货物运往世界各地,Docker将这个模型运用到自己的设计中,唯一不同的是:集装箱运输货物,而Docker运输软件。
使用Docker可以实现开发人员的开发环境、测试人员的测试环境、运维人员的生产环境的一致性。
基于安装在主操作系统上的虚拟机管理系统(如:VirtualBox和VMWare等)
**结构:**基础设施–主操作系统–虚拟机管理系统–Virtual Machine–虚拟操作系统
是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统虚拟机则是在硬件层面实现虚拟化。
**结构:**基础设施–主操作系统–Docker
**特点:**docker启动速度比较快,占用体积较小;
**注意:**这里的docker不会像vm传统的虚拟系统一样在主系统上虚拟出来,而是一个与主系统并存的平级的操作系统;
Docker守护进程:就是驻扎在基础设施上的并行的操作系统,是Docker服务器端进程,负责支撑Docker 容器的运行以及镜像的管理
仓库Registry:一个存放多个镜像的仓库,可以理解为代码控制中的代码仓库
镜像Images:用于创建Docker容器的模板,镜像是基于联合文件系统的一个层式结构,由一系列指令一步步构建的系统指令。
容器:容器是独立运行的一个或一组应用,实质就是虚拟系统;
Docker客户端:Docker 客户端通过命令行或者其他工具使用 Docker API 与 Docker 的守护进程通信
Docker可以运行在多种操作系统上,本例使用CentOS7。
安装步骤:
1.更新yum源为ustc;
sudo yum update
2.安装docker;
#安装需要的安装包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
注意:yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖;
3.设置yum源
3.1更新docker的镜像源为ustc;
sudo yum-config-manager --add-repo http://mirrors.ustc.edu.cn/dockerce/linux/centos/docker-ce.repo
3.2更新docker的镜像源为anliyun(可能失败);
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/dockerce/linux/centos/docker-ce.repo
4.安装docker,-y代表输入界面确认
sudo yum install -y docker-ce
sudo yum install docker-ce
注意:出现输入的界面时,都要选择y;
5.使用docker命令操作docker
# 查看docker的版本
docker -v
# 启动
systemctl start docker
# 停止
systemctl stop docker
#查看docker启动状态
systemctl status docker
ustc是老牌的linux镜像服务提供者了。ustc的docker镜像加速器速度很快。ustc docker mirror的优势之一就是不需要注册,是真正的公共服务。
安装镜像步骤:
1.编辑json文件
#在 /etc/docker/daemon.json下编辑(先创建,如果没有的话)
mkdir /etc/docker #创建文件夹
vi /etc/docker/daemon.json #创建并编辑文件
2.在json文件中编辑
{
"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}
docker images
**注意:**查询结果列表中的各个字段的意思为:
#在网络中去查询所需要的镜像名
docker search 镜像名称
注意:在查询结果列表中的各项含义:
#从中央Docker仓库去下载镜像到本地,如果限制版本号,默认下载最新
docker pull 镜像名称
#可以按照镜像的id来删除
docker images
docker rmi 镜像id
#删除所有镜像
docker rmi $(docker images -q)
docker rmi `docker images -q`
# 启动docker服务:
systemctl start docker
# 停止docker服务:
systemctl stop docker
# 重启docker服务:
systemctl restart docker
# 查看docker服务状态:
systemctl status docker
# 设置开机启动docker服务:
systemctl enable docke
注意:
拉取:docker pull 镜像名称:版本号(若不指定则会拉取最新的版本)
删除全部镜像:docker rmi ` docker images -q ` (慎用)
容器,也是docker中的核心概念,容器是由镜像运行产生的运行实例。镜像和容器的关系,就如同Java语言中类和对象的关系。
#查看正在运行的容器
docker ps
#查看所有容器使用命令
docker ps -a
可以基于已有的镜像来创建和启动容器,创建与启动容器使用命令
docker run 容器类型 --name=容器名 镜像名 /bin/bash
参数说明:
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。 --name :为创建的容器命名。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件 映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
以交互式方式创建并启动容器,启动完成后,直接进入当前容器。使用exit命令退出容器。需要注意的是以此种方式 启动容器,如果退出容器,则容器会进入停止状态
操作步骤:
1.拉取镜像(容器是基于镜像运行);
docker pull centos7
2.创建并启动交互式容器,docker交互式容器(启动容器之后会直接进入容器的命令行终端,如果退出则容器停止运行)
docker run -it --name=mycentos7 centos:7 /bin/bash
小结:
# 查看容器
docker ps -a
# 创建并启动交互式容器mycentos7
docker run -it --name=mycentos7 centos:7 /bin/bash
启动交互式容器之后是直接进入容器终端;可以查看容器的文件结构;使用exit命令则会退出终端并且停止容器。
创建一个守护式容器;如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。命令如下(容器名称 不能重复):
操作步骤:
创建并启动docker容器,可以在后台运行;
# 创建并启动守护式容器mycentos2
docker run -di --name=mycentos2 centos:7
在创建交互式容器之后如果退出的话,容器处于停止状态,可以使用命令再次启动容器,使用命令进入容器并操作。
# 启动容器后再进入容器
docker exec -it mycentos2 /bin/bash
小结:
守护式容器在启动之后会一直在后台运行,即使进入容器之后执行exit命令也不会停止容器;
适用于需要长期运行容器的情况
#停止正在运行的容器,通过容器名称或容器id
docker stop mycentos2
#启动已运行的容器,通过容器名称或容器id
docker start mycentos2
将linux宿主机的文件拷贝到容器中
#创建文件
touch abc.txt
#拷贝到容器目录下,这就把文件拷贝到容器根目录了
docker cp abc.txt mycentos2:/
#进入到mycentos2容器
docker exec -it mycentos2 /bin/bash
ll # 查看的根目录下的文件
exit #退出容器,从容器cp到宿主机
#在宿主机下执行,将根目录下的/abc.txt复制到宿主机的root目录下
docker cp mycentos2:/abc.txt /root
#注意这里的cba.txt在根目录与bin/bash无关
在创建容器的时候,将宿主机的目录与容器内的目录进行映射,两者就可以共享该文件夹了,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
# 创建linux宿主机器要挂载的目录
mkdir /usr/local/test
# 创建并启动容器mycentos3,并挂载linux中的/usr/local/test目录到容器的/usr/local/test;也就是在 linux中的/usr/local/test中操作相当于对容器相应目录操作
docker run -di -v /usr/local/test:/usr/local/test --name=mycentos3 centos:7
# 在linux下创建文件
touch /usr/local/test/def.txt
# 进入容器
docker exec -it mycentos3 /bin/bash
注意:共享的是多级的目录,可能会出现权限不足的提示。 这是因为CentOS7中的安全模块selinux把权限禁掉了,需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mNBLI9ZU-1603091450880)(G:/迅雷下载/springboot课件/docker/笔记/assets/1559728403934.png)]
#在linux宿主机下查看 mycentos3 的ip
docker inspect mycentos3
**注意:**容器之间在一个局域网内,linux宿主机器可以与容器进行通信;但是外部的物理机笔记本是不能与容器直接通 信的,如果需要则需要通过宿主机器端口的代理。
#删除容器
docker rm mycentos7
#删除所有容器,慎用
docker rm docker `ps -a -q`
docker rm docker $(ps -a -q)
**注意:**如果容器是运行状态则删除失败,需要停止容器才能删除
# 拉取MySQL 5.7镜像
docker pull centos/mysql-57-centos7
在创建mysql容器的时候使用-p指定端口映射实现连接;
# 创建mysql5.7容器
docker run -di --name=mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root centos/mysql-57-centos7
注意:
-p 代表端口映射,格式为 宿主机映射端口:容器运行端口
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD 是root用户的远程登陆密码(如果是在容器中使用root登录的话, 那么其密码为空
# 拉取MySQL 5.7镜像
docker exec -it mysql5.7 /bin/bash
# 登录容器里面的mysql
mysql -u root -p
# 查看ip;如果以后要内部连接该mysql,如其他容器中要连接mysql容器的mysql的时候,可以使用如下命令查看Ip
docker inspect mysql5.7
在创建容器的时候mysql的root用户可以指定远程访问的密码。
USE mysql;
#1.查看用户信息
select host,user,plugin,authentication_string from mysql.user;
#我们需要更新root和%host两个账号的密码为登陆密码root
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
#更新权限
FLUSH PRIVILEGES;
小结:
在创建容器的时候指定环境变量MYSQL_ROOT_PASSWORD表示使用root进行远程连接时候的密码。如果需要进行远程连接的话可以使用-p进行端口映射。
将项目文件上传到容器中的tomcat目录(webapps)
创建容器的时候可以指定-v进行目录挂载,tomcat在容器中的目录(/usr/local/tomcat/webapps)
#拉取镜像
docker pull tomcat
将默认的8080端口映射到宿主机的9000端口;
把wabapps的文件夹共享到宿主机;
#创建tomcat容器,挂载webapps目录
docker run -di --name=mytomcat -p 9000:8080 -v /usr/local/tomcat/webapps:/usr/local/tomcat/webapps tomcat
**注意:**本机的tomcat是空的,访问后是404状态
# 如果出现 WARNING: IPv4 forwarding is disabled. Networking will not work. #执行如下操作
# 1、编辑 sysctl.conf
vi /etc/sysctl.conf
# 2、在上述打开的文件中后面添加
net.ipv4.ip_forward=1
# 3、重启network
systemctl restart network
http://192.168.76.128:9000
小结:
上传项目文件可以使用容器的目录挂载功能,外部访问可以使用端口映射
# 拉取nginx镜像
docker pull nginx
nginx的默认访问端口是:80
在创建容器的时候需要进行端口映射,指定-p,映射到宿主机的端口80,然后通过宿主机的80端口来访问;
# 创建nginx容器
docker run -di --name=mynginx -p 80:80 nginx
在浏览器上访问容器中nginx,http://192.168.76.128
小结:
如果宿主机被占用了80端口,那么在指定映射的时候可以改变宿主机的端口映射,在访问时也需要带上端口号。
# 拉取redis镜像
docker pull redis
默认端口是6379,如果需要外部访问则可以使用端口映射;
# 创建redis容器
docker run -di --name=myredis -p 6379:6379 redis
①使用命令行客户端 ②使用图形界面工具
#进入redis容器
docker exec -it myredis /bin/bash
#进入redis安装目录
cd /usr/local/bin
#连接redis
./redis-cli
可以使用redis图形界面客户端工具连接redis,端口也是6379。
docker run -id --name=changgou-rabbit -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 15672:15672 -p 25672:25672 rabbitmq:management
Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。它是一个定义和运行多容器的 docker应用工具。
使用compose,你能通过YMAL文件配置你自己的服务,然后通过一个命令,你能使用配置文件 创建和运行所有的服务。
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/dockercompose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 设置文件可执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose -version
注意:在设置文件可执行权限中:
+X ,加可执行, +r,可读,+w,可写
docker-compose是一个应用工具;可以通过配置docker-compose.yml文件同时启动多个容器。
部署项目时可以编写一个docker-compose.yml文件作为启动项目单位,同时启动项目相关的那些容器。
#二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose
指令 | 功能 |
---|---|
build | 指定服务镜像Dockerfile所在路径 |
cap_add, cap_drop | 指定容器的内核能力(capacity)分配 |
command | 覆盖容器启动后默认执行的命令 |
cgroup_parent | 指定父cgroup组,意味着将基础该组的资源限制 |
container_name | 指定容器名称。默认将会使用项目名称服务名称序号这样的格式 |
devices | 指定设置映射关系 |
dns | 自定义DNS服务器。可以是一个值,也可以是一个列表 |
dns_search | 配置DNS搜索域。可以是一个值,也可以是一个列表 |
dockerfile | 指定额外编译镜像的Dockerfile文件,可以通过该指令来指定 |
env_file | 从文件中获取环境变量,可以为单独的文件路径或列表 |
environment | 设置环境变量,可以使用数组或字典两种格式 |
expose | 暴露端口 |
external_links | 链接到docker-compose.yml外部的容器,甚至可以是非Compose管理的外部容器 |
extra_hosts | 指定额外的host名称映射信息 |
image | 指定为镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取这个镜 |
labels | 指定服务镜像Dockerfile所在路径 |
links | 链接到其他服务中的容器 |
log_driver | 指定日志驱动类型,类似于Docker中的–log-driver参数。目前支持三种日志驱动类型: log_driver:“json-file”、log_driver:“syslog”、log_driver:“none” |
log_opt | 日志驱动的相关参数 |
docker-compose来实现一次启动多个容器;
通过配置docker-compose模板文件(docker-compose.yml),在这个配置文件中去配置各个容器及其相关的依赖。
version: "2"
services:
web:
images: nginx
ports: - "8080:80"
volumes: - /usr/local/abc:/usr/local/cba
#volumes:
#networks
(模板文件所在的目录,docker-compose.yml)
# 创建文件夹
mkdir -p /usr/local/mycompose
#进入文件夹
cd /usr/local/mycompose
#创建 docker-compose.yml文件;内容如下
vi docker-compose.yml
version: '3'
services:
redis1:
image: redis #镜像
ports: #端口
- "6379:6379"
container_name: "redis1" #容器名
networks: #网路
- dev
mysql1:
image: centos/mysql-57-centos7
environment:
MYSQL_ROOT_PASSWORD: "root"
ports:
- "3306:3306"
container_name: "mysql1"
networks:
- dev
web1:
image: tomcat
ports:
- "9090:8080"
container_name: "web1"
networks:
- dev
- pro
networks:
dev:
driver: bridge
pro:
driver: bridge
注意:docker-compose可以配置一个模板文件实现一次可以启动多个容器,运行时候可以执行一个up则会创建并启动模板文件中的各个服务。
模板文件是yml格式的;编写的时候需要注意其格式。
#启动前最好把docker重启,不然原来的tomcat/mysql/redis容器也是启动状态的话,那么端口会冲突而启动失败
systemctl restart docker
cd /usr/local/mycompose
docker-compose up
# 如果后台启动则使用如下命令
docker-compose up -d
# 若要停止
docker-compose stop
在当前的容器中安装了各种组件;期望在其他服务器上也能快速拥有该容器的一切环境;可以将当前的容器制作为一个镜像,再将该奖项复制到其他服务器,其他服务器再基于镜像运行容器。
第一个是我的docker名,第二个是保持的镜像名
docker commit mynginx mynginx
docker save -o mynginx.tar mynginx
#删除mynginx容器
docker rm mynginx
#删除mynginx容器
docker rmi mynginx
#加载新镜像
docker load -i mynginx.tar
注意:在执行docker load命令恢复镜像时,需要先删除原镜像
docker run -di --name=mynginx -p 80:80 mynginx
小结:
docker容器可以保存为一个镜像;备份为一个镜像包(*.tar)可以复制迁移到其他服务器,再恢复该tar包中的镜像,基于镜像运行容器实现环境的一致。
我们可以使用pull的方式从docker仓库下载镜像,也可以是使用自己打包的开发镜像tar;这里再提供一种方式:使用Dockerfile创建一个自定义jdk1.8的镜像的方式;
注意第一种不带有环境的镜像,其余两种都可以复制镜像环境;
自定义镜像将环境集成到内部;Dockerfile将镜像的配置信息道Dockerfile文件中,进行脚本执行;两者效果一致,第二种更好。
Dockerfile是由一系列命令和参数构成的文本文件,在文件中可以指定各个组件资源和运行命令等。
分析:
假设在centos7作为基础镜像上;添加jdk1.8并构建一个包含jdk1.8的centos7新镜像。
Dockerfile是由一系列命令和参数构成的文本文件,在文件中可以指定各个组件资源和运行命令等。
实现步骤:
#先查看有没有
#创建目录
mkdir -p /usr/local/dockerjdk8/
ll
cd /usr/local/dockerjdk8/
#在jdk8的目录下创建Dockfile文件
vi Dockerfile
FROM centos:7
MAINTAINER ITCAST
WORKDIR /usr
RUN mkdir /usr/local/java
ADD jdk-8u202-linux-x64.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8.0_202
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
# 4、执行命令构建镜像;不要忘了后面的那个 "."
docker build -t='jdk1.8' .
# 5、查看镜像是否建立完成
docker images
小结:
Dockerfile可以基于镜像制作镜像;docker build -t='jdk1.8' .
有时候我们的服务器无法访问互联网,或者你不希望将自己的镜 像放到公网当中,那么我们就需要搭建自己的私有仓库来存储和管理自己的镜像。
私有仓库的搭建步骤
# 1、拉取私有仓库镜像
docker pull registry
# 2、启动私有仓库容器,默认端口5000
docker run -di --name=registry -p 5000:5000 registry
# 3、打开浏览器 输入地址http://宿主机ip:5000/v2/_catalog
#看到{"repositories":[]} 表示私有仓库 搭建成功
# 4、修改宿主机daemon.json,之前只信任中央仓库ip
vi /etc/docker/daemon.json
# 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将宿主机ip修改为自己宿主机真实ip
{"insecure-registries":["宿主机ip:5000"]}
# 5、重启docker服务
systemctl restart docker
# 启动私有仓库
docker start registry
小结:
拉取registry镜像;基于镜像创建私有仓库容器;
需要去修改docker的一个配置文件指定私有仓库地址;再访问私有仓库:http://ip:5000/v2/_catalog
目标:将制作的jdk1.8的镜像上传到私有仓库
# 1、标记镜像jdk1.8为私有仓库的镜像
docker tag jdk1.8 宿主机IP(192..):5000/jdk1.8
# 2、再次启动私有仓库容器
docker restart registry
# 3、上传标记的镜到私有仓库
docker push 宿主机IP:5000/jdk1.8
# 4、输入网址查看仓库效果
192.168.76.128:5000/v2/_catalog
小结:
将本地镜像打标签(标记本地镜像为一个私有仓库中的镜像);将打了标签的镜像推送到私有仓库。
docker pull 私有仓库地址/镜像名称
# 因为私有仓库所在的服务器上已经存在相关镜像;所以先删除;请指定镜像名,不是id
docker rmi 服务器ip:5000/jdk1.8
#拉取镜像
docker pull 服务器ip:5000/jdk1.8
#可以通过如下命令查看
docker 的信息;了解到私有仓库地址 docker inf
#打开配置文件
vi /usr/lib/systemd/system/docker.service
# 在打开的上述文件中按照下面的图,添加如下的内容;注意修改下面内容中的ip地址
--add-registry=192.168.12.135:5000
--insecure-registry=192.168.12.135:5000 \
# 修改完后需要重新加载docker配置文件并重启
docker systemctl daemon-reload systemctl restart docker
如果本地存在同名的镜像需要先删除镜像后拉取
dk1.8 宿主机IP(192…):5000/jdk1.8
docker restart registry
docker push 宿主机IP:5000/jdk1.8
192.168.76.128:5000/v2/_catalog
**小结**:
将本地镜像打标签(标记本地镜像为一个私有仓库中的镜像);将打了标签的镜像推送到私有仓库。
## 3.8 从私有仓库拉取镜像
- 私有仓库与拉取镜像的服务器是在同一台机器上:直接拉取镜像; `docker pull 私有仓库地址/镜像名称`
```shell
# 因为私有仓库所在的服务器上已经存在相关镜像;所以先删除;请指定镜像名,不是id
docker rmi 服务器ip:5000/jdk1.8
#拉取镜像
docker pull 服务器ip:5000/jdk1.8
#可以通过如下命令查看
docker 的信息;了解到私有仓库地址 docker inf
#打开配置文件
vi /usr/lib/systemd/system/docker.service
# 在打开的上述文件中按照下面的图,添加如下的内容;注意修改下面内容中的ip地址
--add-registry=192.168.12.135:5000
--insecure-registry=192.168.12.135:5000 \
# 修改完后需要重新加载docker配置文件并重启
docker systemctl daemon-reload systemctl restart docker
如果本地存在同名的镜像需要先删除镜像后拉取
感谢阅读,如有错误之处,请批评指正