MX的Docker学习笔记

本文详细介绍了Docker的基本概念,包括镜像与容器的区别、DockerHub的作用,以及dockerrun命令的解析。此外,还涵盖了数据卷、Dockerfile自定义镜像、DockerCompose部署微服务和搭建私有镜像仓库等内容。
摘要由CSDN通过智能技术生成

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值