目录
Docker
基本操作
镜像操作
-
镜像名称
- 由两部分组成: [repository]:[tag]
- 在没有指定tag时,默认是latest,代表最新版本的镜像
-
镜像命令
-
拉取镜像
docker pull 镜像名
eg:docker pull redis,不指定tags的情况下默认拉取最新版本,即latest -
查看拉取的镜像
docker images
-
将镜像保存为压缩包
docker save -o 保存文件名 镜像名
eg: docker save -o redis.tar redis:latest -
加载镜像压缩包
docker load -i 文件名
eg: docker load -i redis.tar -
移除本地镜像
docker rmi 镜像名
eg: docker rmi redis:latest
-
容器操作
-
创建并运行容器
-
docker run
-
eg: docker run --name containerName -p 80:80 -d nginx
-
参数解释
- –name: 设置容器名
- containerName: 容器名
- -p: 端口映射,冒号左边是宿主机端口,右边是容器端口
由于容器为隔离环境,我们无法直接访问其端口,故需要将其端口与宿主机端口做一个映射,通过访问宿主机端口去访问容器端口 - -d: 使容器后台运行
- nginx: 镜像名
-
-
-
暂停运行中的容器
- docker pause 容器名
-
让暂停的容器恢复运行
- docker unpause 容器名
-
停止运行中的容器
- docker stop 容器名
-
让停止的容器恢复运行
- docker start 容器名
-
暂停与停止的区别
- 暂停: CPU停止运行,不释放内存
停止: 回收进程占用的CPU,内存等资源
- 暂停: CPU停止运行,不释放内存
-
查看容器执行日志
-
docker logs [-f]
- -f表示动态查看日志
-
-
查看所有容器及状态
-
docker ps [-a]
- 默认查看的是所有运行中的容器
-a表示查看包括非运行状态的容器
- 默认查看的是所有运行中的容器
-
-
删除容器
-
docker rm [-f] 容器名
- 默认只能删除非运行状态的容器
-f用于强制删除,可删除运行中的容器
- 默认只能删除非运行状态的容器
-
-
进入容器执行命令
-
docker exec
-
eg1: docker exec -it 容器名 bash
-
eg2: docker exec -it myredis redis-cli
-
参数解释
- -it: 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
- bash: 进入容器后执行的命令,bash是一个linux终端交互命令
-
-
-
对于陌生的镜像,建议去dockerhub等docker registry查看其使用命令
数据卷
-
定义
- 一个虚拟目录,指向宿主机文件系统的某个目录
-
作用
- 将容器与数据解耦合,方便操作容器内的数据,保证数据安全
-
数据卷操作命令
-
创建数据卷
- docker volume create 数据卷名
-
查看数据卷列表
- docker volume ls
-
查看数据卷详细信息
- docker volume inspect 数据卷名
-
删除未使用的数据卷
- docker volume prune
-
删除指定数据卷
- docker volume rm 数据卷名
-
-
数据卷挂载
- 命令: -v volumeName:/targetContainerPath
如果数据卷不存在会被创建 - eg:创建数据卷html,将其挂载到nginx的html目录中
- 命令: -v volumeName:/targetContainerPath
docker run --name ng -p 80:80 -v html:/usr/share/nginx/html -d nginx
实现挂载之后便可以在数据卷html所在真实目录下修改容器内/usr/share/nginx/html目录内文件
-
作用:将数据卷挂载到容器目录下,便于在容器外部直接修改容器内数据
-
目录直接挂载
- 使用-v命令将宿主机目录/文件直接挂载到容器目录/文件
- 语法:
-v [宿主机目录]:[容器内目录]
-v [宿主机文件]:[容器内文件] - eg: 将宿主机目录和文件挂载到mysql容器中
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 -v /root/test/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf -v /root/test/mysql/data:/var/lib/mysql -d mysql:5.7.25
-
数据卷挂载与目录直接挂载对比
- 数据卷挂载耦合度低, 且目录由docker管理,但目录相对较深,寻找不变
目录直接挂载耦合度高,目录需要自己管理,但目录位置易寻找
- 数据卷挂载耦合度低, 且目录由docker管理,但目录相对较深,寻找不变
Dockerfile自定义镜像
镜像结构
Dockerfile语法
案例1:基于Ubuntu构建java项目
- 步骤1:新建一个空文件夹docker-demo
- 步骤2:将需要制作成镜像的java项目jar包拷贝到该目录下
- 步骤3:拷贝需要的jdk8压缩包到该目录下
- 步骤4:编写Dockerfile文件并拷贝到该目录下
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 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
- 步骤5: 在该目录下执行命令
docker build -t javaweb:1.0
案例2:基于java8构建项目
虽然我们可以基于Ubuntu基础镜像,添加任意自己需要的安装包,构建镜像,但是却比较麻烦。所以大多数情况下,我们都可以在一些安装了部分软件的基础镜像上做改造。
例如,构建java项目的镜像,可以在已经准备了JDK的基础镜像基础上构建。
需求:基于java:8-alpine镜像,将一个Java项目构建为镜像
- 步骤一:新建空目录
- 步骤二:将需要制作成镜像的java项目jar包拷贝到该目录下
- 步骤三:编写Dockerfile文件并拷贝到该目录下
Dockerfile文件内容如下
FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
EXPOSE 8090
ENTRYPOINT java -jar /tmp/app.jar
- 步骤四:执行docker build命令构建对象
- 步骤五:执行docker run命令创建并运行容器
Docker-Compose
Docker-Compose简介
- 可以根据compose文件快速部署分布式应用,不需要手动一个个创建运行
- compose文件本质就是一个文本文件,通过指令定义集群中每个容器如何运行,可将其看作是多个docker run命令的集合体,仅语法上存在差异
案例:微服务集群部署
-
实现步骤
- 步骤一:创建一个空目录cloud-demo,在其中为每个微服务创建子目录(gateway,userservice,orderservice,mysql)
- 步骤二: 编写docker-compose文件
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/lib/mysql" - "$PWD/mysql/conf:/etc/mysql/conf.d/" userservice: build: ./user-service orderservice: build: ./order-service gateway: build: ./gateway ports: - "10010:10010"
- 步骤三: 准备数据库数据到mysql目录中,在各子目录中提供将userservice,orderservice,gateway编译成镜像的Dockerfile文件
- 步骤四: 在项目中将各服务模块的ip地址配置改为服务名,并打包为jar包,存放到cloud-demo对应的子目录中去
- 步骤五: 将cloud-demo文件夹上传到Linux服务器
- 步骤六: 进入cloud-demo文件夹,执行命令
docker-compose up -d
即可
Docker镜像仓库
搭建私有镜像仓库
-
配置Docker信任地址
- 这里搭建的私服使用的是http协议,默认不被Docker支持,需要进行如下配置
# 打开要修改的文件 vi /etc/docker/daemon.json # 添加内容: "insecure-registries":["http://192.168.204.128:8080"] # 重加载 systemctl daemon-reload # 重启docker systemctl restart docker
-
使用docker-compose部署带有图形化界面的DockerRegistry
- docker-compose文件内容如下
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
拉取/推送镜像
-
步骤
- 重新tag本地镜像,以nginx镜像为例,执行如下命令
docker tag nginx:latest 192.168.204.128:8080/nginx:1.0
- 推送重新tag后的镜像到私有镜像仓库,执行如下命令
docker push 192.168.204.128:8080/nginx:1.0
- 从私有镜像仓库拉取镜像到本地,执行如下命令即可
docker pull 192.168.204.128:8080/nginx:1.0