Docker学习
概念
镜像和容器
当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)
镜像仓库
存储和管理镜像的平台,Docker官方维护了一个公共仓库:Docker Hub
与虚拟机对比
特性 | Docker | 虚拟机 |
---|---|---|
性能 | 接近原生 | 性能较差 |
硬盘占用 | 一般为 MB | 一般为GB |
启动 | 秒级 | 分钟级 |
DockerHub
DockerHub是一个Docker镜像的托管平台。这样的平台称为Docker Registry。
docker 架构
Docker是一个CS架构的程序,由两部分组成
- 服务端(server): Docker守护进程,负责处理Docker指令,管理镜像、容器等
- 客户端(client): 通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。
docker run命令解析
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 mysql
docker run:创建并运行一个容器,
-d 是让容器在后台运行
–name mysql:给容器起个名字,必须唯一
-p 3306:3306:设置端口映射
-e KEY=VALUE:是设置环境变量
最后一个mysql:指定运行的镜像的名字 完整写法是[repository]:[tag]写明版本,默认最新
可以在docker hub中查看该镜像的环境变量的说明
访问容器
可以通过访问容器所在的宿主机的对应映射到容器相应功能的端口来实现容器内服务的访问。
常见命令
查看镜像列表
docker images
镜像搜索
docker search ubuntu
下拉镜像
docker pull 镜像名:Tag
删除镜像
docker rmi -f 镜像名/镜像ID
保存镜像
docker save 镜像名/镜像ID -o 镜像保存在哪个位置与名字
加载镜像
docker load -i 镜像保存文件位置
容器列表
sudo docker ps
sudo docker ps -a # 查看所有容器 -----包含正在运行 和已停止的
创建容器
docker run -it -d --name 要取的别名 -p 宿主机端口:容器端口 -v 宿主机文件存储位置:容器内文件位置 镜像名:Tag /bin/bash
停止容器
sudo docker stop 容器名/容器ID
删除容器
#删除一个容器
docker rm -f 容器名/容器ID
#删除多个容器 空格隔开要删除的容器名或容器ID
docker rm -f 容器名/容器ID 容器名/容器ID 容器名/容器ID
#删除全部容器
docker rm -f $(docker ps -aq)
进入容器
进入正在运行中的容器
docker ps
docker exec -it 775c7c9ee1e1 /bin/bash
sudo docker attach 容器ID/容器名
查看容器详情
docker inspect 容器ID/容器名
离线拷贝方法
以下是在 Ubuntu 环境下打包 Docker 容器并在另一台服务器上离线安装的方法:
在 Ubuntu 环境下打包 Docker 容器
首先,使用 docker save 命令将 Docker 容器打包成 tar 文件,例如:
docker save -o container.tar container-image:tag
其中, container-image:tag 是要打包的 Docker 容器的名称和标签, -o 参数指定输出文件名为 container.tar 。然后,将打包好的 tar 文件传输到目标服务器。
在目标服务器上离线安装 Docker 容器
首先,使用 docker load 命令加载 tar 文件,例如:
docker load -i container.tar
然后,使用 docker run 命令运行容器,例如:
docker run -d --name container-name -p host-port:container-port container-image:tag
其中, container-name 是容器的名称, host-port 是主机端口, container-port 是容器端口, container-image:tag 是容器的名称和标签。
命令别名
通过命令
vi ~/.bashrc
进入文件中可以定义命令别名
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
数据卷
docker容器中并没有全部的命令,他是最小化的系统镜像,只有维持功能运行的基础命令功能。
数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。
每一个数据卷都和宿主机的实际目录进行一一对应,只需要将数据卷和容器内的路径挂载起来,就能通过数据卷实现宿主机的文件系统和容器的文件系统的数据双向挂载。
docker volume create 创建数据卷
docker volume ls查看所有数据卷
docker volume rm删除指定数据卷
docker volume inspect查看某个数据卷的详情
docker volume prune清除数据卷
数据卷挂载
在执行docker run命令时,使用**-v 数据卷:容器内目录**可以完成数据卷挂载当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
本地目录挂载
在执行docke rrun命令时,使用**-v 本地目录:容器内目录**可以完成本地目录挂载
Dockerfile自定义镜像
镜像结构
-
入口(Entrypoint)
镜像运行入口,一般是程序启动的脚本和参数
-
层( Layer )
在Baselmage基础上添加安装包、依赖、配置等,每次操作都形成新的一层。
-
基础镜像(Baselmage)
应用依赖的系统函数库、环境、配置、文件等
什么是Dockerfile
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
指令 | 说明 | 示例 |
---|---|---|
FROM | 指定基础镜像 | FROM centos:6 |
ENV | 设置环境变量,可在后面指令使用 | ENV key value |
COPY | 拷贝本地文件到镜像的指定目录 | c0PY./mysql-5.7.rpm/tmp |
RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN yum install gcc |
EXPOSE | 指定容器运行时监听的端☐,是给镜像使用者看的 | EXP0SE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
Dockerfile的第一行必须是FROM,从一个基础镜像来构建.
案例1
目标:基于Ubuntu镜像构建一个新镜像,运行一个java项目
-
步骤1:新建一个空文件夹docker-demo
-
步骤2:拷贝课前资料中的docker-demojar文件到docker-demo这个目录
-
步骤3:拷贝课前资料中的jdk8.tar.gz文件到docker-demo这个目录
-
步骤4:拷贝课前资料提供的Dockerfile到docker-demo这个目录
-
步骤5:进入docker-demo
-
步骤6: 运行命令:
docker build -t javaweb:1.0 .
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local
# 拷贝jdk的包
COPY ./jdk8.tar.gz $JAVA_DIR/
# 安装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
# 拷贝java项目的包
COPY ./docker-demo.jar /tmp/app.jar
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
案例2
基于java:8-alpine部署JAVA项目
实现思路如下:
- 新建一个空的目录,然后在目录中新建一个文件,命名为Dockerfile
- 拷贝课前资料提供的docker-demo.jar到这个目录中
- 编写Dockerfile文件:
- a ) 基于java:8-alpine作为基础镜像
- b ) 将app.jar拷贝到镜像中
- c ) 暴露端口
- d ) 编写入口ENTRYPOINT
- 使用docker build命令构建镜像
- 使用docker run创建容器并运行
# 指定基础镜像
FROM java:8-alpine
COPY ./docker-demo.jar /tmp/app.jar
#暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
DockerCompose
什么是DockerCompose
Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!
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
安装DockerCompose
实现微服务部署
1、查看课前资料提供的cloud-demo文件夹,里面已经编写好了docker-compose文件
version: "3.2
services:
nacos:
image: nacos/nacos-server
environment:
MODE: standalone
ports:
- "8848:8848"
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- "$PWD/mysql/data:/var/1ib/mysql"
- "$PWD/mysql/conf:/etc/mysql/conf.d/"
serservice:
build: ./user-service
orderservice:
build: ./orderservice
gateway:
build: ./gateway
ports:
- "10010:10010"
2、修改自己的cloud-demo项目,将数据库、nacos地址都命名为docker-compose中的服务名(具体的就是每个项目中的localhost改成服务名)
3、使用maven打包工具,将项目中的每个微服务都打包为app.jar
4、将打包好的app.jar拷贝到cloud-demo中的每一个对应的子目录中
5、将cloud-demo上传至虚拟机,利用 docker-compose up -d 来部署
值得注意的一点在于由于nacos是需要首先部署的,所以如果和其他微服务放在一起部署可能出现问题,这个时候需要
docker-compose restart 服务名
Docker镜像仓库
搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现
简化版镜像仓库
Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。
搭建方式比较简单,命令如下:
docker run -d \
--restart=aways \
--name registry \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry
带有图形化界面版本
使用DockerCompose部署带有图象界面的DockerRegistry,命令如下
version: '3.0'
services:
registry:
image: registry
volumes:
- ./registry-data:/var/lib/registry
ui:
image: joxit/docker-registry-ui:static
ports:
- 8080:80
environment:
- REGISTRY_TITLE=传智教育私有仓库
- REGISTRY_URL=http://registry:5000
depends_on:
- registry
配置Docker信任地址
我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://192.168.150.101:8080"]
# 重加载
systemct] daemon-reoad
# 重启docker
systemct] restart docker
在私有镜像仓库推送或拉取镜像
1、重新tag本地镜像,名称前缀为私有仓库的地址:192.16850.101:8080/
docker tag nginx:latest 192.168.150.101:8080/nginx:1.0
2、推送镜像
docker push 192.168.150.101:8080/nginx:1.0
3、拉取镜像
docker pull 192.168.150.101:8080/nginx:1.0