Docker简介
(容器:可以在内部安装各种依赖,一般用于部署应用程序,可以解决版本差异)
是一个快速交付应用,运行应用的技术。
docker:可以在内部安装各种依赖,一般用于部署应用程序,可以解决版本差异
systemctl start | stop | restart docker
镜像:镜像是一个特殊的环境,包含需要部署的应用,同时还包含了系统的指令和环境变量等。
搜索镜像:docker search [OPTIONS] TERM
上传镜像:docker push [OPTIONS] NAME[:TAG]
下载镜像:docker pull [OPTIONS] NAME[:TAG]
提交镜像:docker commit [OPTIONS] CONTAINER NAME[:TAG]
构建镜像:docker build [OPTIONS] PATH
删除镜像:docker rmi [OPTIONS] IMAGE [IMAGE...]
增加镜像标签:docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
查看所有镜像:docker images [OPTIONS] [REPOSITORY[:TAG]]
容器:容器是一个由镜像运行之后形成的一个密闭的环境
启动/重启容器:docker start/restart CONTAINER
停止/强停容器:docker stop/ kill CONTAINER
删除容器:docker rm [OPTIONS] CONTAINER [CONTAINER...]
重命名容器:docker rename CONTAINER CONTAINER_NEW
进入容器:docker attach CONTAINER
执行容器命令:docker exec CONTAINER COMMAND
查看容器日志:docker logs [OPTIONS] CONTAINER
查看容器列表:docker ps [OPTIONS]
卷:卷就是一个目录,主要目的是挂载容器的目录,这样就能操作容器
dockerhub:是一个镜像仓库可以从中拉取镜像
docker两大功能:安装 部署
1.1.1.具备的功能:
1、可以将程序及其依赖、运行环境一起打包成一个镜像,并且可以迁移到任意linux系统下
2、运行时利用沙箱机制形成隔离容器,各个应用之间相互不干扰
3、启动、移除都可以通过一行命令完成,方便快捷。
1.1.2.为啥要应用docker?
1、依赖关系复杂,容易出现 兼容性问题
2、开发、测试、生产环境有差异
1.1.3.docker重点面试题
一、如何解决大型项目依赖关系复杂,不同组件的兼容性问题?
1、将应用的函数库 、依赖、配置与应用一起打包
2、将每个应用放到一个隔离容器去运行,避免相互干扰
docker把系统的函数库和依赖,单独收集起来,用容器去运行,容器内可以随意改变,直到当前应用合适为止,并且不会影响本地的函数库和依赖
二、docker如何解决不同系统环境的问题?
1、将用户程序与需要调用的系统函数库一起打包
2、docker运行不同的操作系统时,镜像中包含整个运行环境,直接基于打包的函数库,借助linux内核来运行。
三、docker与虚拟机的差别?
虚拟机是在操作系统中模拟硬件设备,然后运行另一个操作系统。
docker仅封装函数库,并没有模拟完整的操作系统
Docker架构
2.2.1.镜像和容器
镜像(Image):docker将应用程序及其所需的依赖、函数库、环境、配置文件等文件打包在一起。(默认只读)
容器(Container):镜像中的应用程序运行之后形成的及进程就是容器,docker会对容器做隔离,对外不可见。一切应用最终都是代码组成,都是硬盘中的一个个的字节形成 的文件,只有在运行时,才会加载到内存,形成进程
2.2.2.DockerHub
Docker是一个CS架构的程序,由亮部分组成:
1、服务端:Docker守护进程,负责处理Docker指令,管理镜像,容器等。
2、客户端:通过命令或RestAPI向Docker服务端发送指令,可以在本地或远程向服务器发送指令
3.3.1.Docker基本操作
3.1.镜像的名称组成
一般分两部分组成:[repository]:[tag],在没有指定tag时,默认是latest,代表最新版本的镜像
3.2.镜像命令
下载镜像
docker pull nginx:latest
将镜像向外输出成压缩文件(输出流):
docker save -o nginx.tar niginx:latest
将由镜像压缩成的文件还原:
docker load -i nginx.tar
往自己的线上本地仓库推送时,需要进行登录
docker login
登录完成后,往本地仓库推送时,需要标注标签(tag)
docker tag nginx:latest 本地仓库名:版本号
进行推送
docker push 本地仓库名:版本号
4.4.1.容器操作
4.1.容器相关命令
docker run:创建并运行一个容器,处于运行状态
docker pause:让一个运行的容器暂停
docker unpause:让一个容器从暂停恢复运行
docker stop:停止一个运行的容器
docker start:让停止的容器再次运行
docker rm:删除一个容器 (-f 强制删除)
运行镜像并能够进行外部访问
docker run --name 名称 -d -p 9090:80 nginx:latest
自定义名称 -p 对外开放一个端口才能进行访问 镜像名
进入nginx,修改配置文件
4.2.1.使用命令 docker exec 进入容器
docker exec -it 容器名 bash
-it:给当前进入的容器创建一个便准输入,输出终端,允许我们与容器交互
bash:进入容器后执行的命令,是一个linux终端交互命令
exit:进行退出
5.5.1.数据卷(容器数据管理的文件夹)
5.1.什么是数据卷?
数据卷是一个虚拟目录,指向宿主机文件系统中的某个目录
linux下创建一个文件夹,容器中也有一个文件夹,使他们相对应,能同步数据
5.2.基础语法:
docker volume
docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步操作
create 创建一个volume
inspect 显示一个或多个volume的信息
ls 列出所有的volume
prune 删除未使用的volume
rm 删除一个或多个指定的volume
5.3.创建数据卷/查看所有数据
docker volume create html/docker volume ls
5.4.挂载数据卷
在运行容器的时候先创建一个数据卷,然后将容器中的某一个目录挂载到数据卷中,可以通过 -v 参数来挂载一个数据卷到某个容器内目录
docker --name nx -d -v 数据名:/usr/share/nginx/html -p 80:80 镜像名
5.5.本地目录挂载
如果使用的是卷挂载,文件会从当前容器中自动同步到宿主机,本地目录挂载不会同步容器内的文件,但可以自定义操作文件或文件夹,我么需要提前创建好一个文件夹,对应在当前部署的应用中去copy配置,然后在运行
5.6.安装nginx
6.6.1.安装redis
6.1.下载镜像
docker pull redis:7.0.11
6.2.运行容器
docker run --name redis -d -p 6379:6379 -v redis:/usr/local/etc/redis/ redis:7.0.11
小结
数据卷挂载与本地目录挂载的不同?
1、数据卷挂载耦合度低,由docker来管理目录,目录较深时,不好寻找,能够反向同步数据
2、本地目录挂载耦合度高,自己来管理目录,目录容易查看,需要使用相同文件去替换,直接同步到容器中
DockerFile自定义镜像
7.7.1.镜像结构
镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成
7.7.2.DockerFile基础语法
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
7.7.3.构建java项目
1、基于ubuntu构建就是java项目
(1)新建一个空文件docker-demo,在里面放入jdk.tar.gz和项目打包好的文件app.jar
(2)创建一个文件Dockerfile,里面追加以下代码
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 安装JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk8.tar.gz \
&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 暴露端口
EXPOSE 8080
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
(3)进入docker-demo文件夹,进行构建
docker build -t javawebdemo:1.0 .
(4)运行这个镜像
docker run --name webdef -p 8090:8090 -d javaweb:1.0
Docker-compose
7.7.1简介
Compose文件是一个文本文件,通过指令文件集群中的每个容器运行
version: "3.8"
services:
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- "/tmp/mysql/data:/var/lib/mysql"
- "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
web:
build: .
ports:
- "8090:8090"
上面的Compose文件就描述一个项目,其中包含两个容器:
1、mysql:一个基于 mysql:5.7.25 镜像构建的容器,并且挂载了两个目录
2、web:一个基于 docker build 临时构建的镜像容器,映射端口时8090
7.7.2.安装DockerCompose
1、通过命令下载
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
2、修改文件权限
chmod +x /usr/local/bin/docker-compose
3、Base自动补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
Docker镜像仓库
8.8.1.搭建私有镜像仓库
1、配置Docker信任地址(我们采用的是http协议,默认不被Docker信任)
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容: 编辑后esc :wq保存
"insecure-registries":["http://192.168.253.100:8888"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker
2、在opt文件夹下创建一个存放compose配置文件的文件夹
cd /opt
mkdir registry-ui
cd registry-ui
touch docker-compose.yaml
3、将下面配置写入文件
version: '3.0'
services:
registry:
image: registry
volumes:
- ./registry-data:/var/lib/registry
ui:
image: joxit/docker-registry-ui:static
#joxit/docker-registry-ui:1.5-static
ports:
- 8888:80
environment:
- REGISTRY_TITLE=个人私有仓库
- REGISTRY_URL=http://registry:5000
depends_on:
- registry
4、执行compose命令
docker-compose up -d
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d -p 3306:3306 mysql:8.0.33
5、推送、拉取镜像
推送镜像到私有镜像服务必须先tag
(1)重新tag本地镜像,名称前缀为私有仓库的地址
docker tag nginx:latest 192.168.253.100:8888/nginx:1.0
#docker tag nginx:latest 192.168.253.100:8888/nginx:latest
(2)推送镜像
docker push 192.168.253.100:8888/nginx:1.0
#docker push 192.168.253.100:8888/nginx:latest
(3)拉取镜像
docker pull 192.168.253.100:8888/nginx:1.0