Docker 基本使用
Docker 简介
Docker 是一个 CS 架构的软件,帮助我们各种服务和应用在Linux中以沙箱的形式运行。
Docker 会把这个应用所使用到的依赖,运行库,甚至可能使用到的系统库,都会一并打包,当应用运行时,应用不会直接在操作系统中寻找运行支持,而是在沙箱中寻找运行支持,使得每一个docker包的运行是互相独立且隔离的。
Docker 与虚拟机的区别
虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系统里面运行 Ubuntu 系统,这样就可以运行任意的Ubuntu应用了。
镜像和容器
镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。
镜像名称说明
- 镜像名称一般分两部分组成:[repository]:[tag]。
- 在没有指定tag时,默认是latest,代表最新版本的镜像
Docker 基础安装
Ubuntu 系统
开始安装前:
1.Ubuntu 可能会存在旧版本的Docker,所以我们如果不知道系统以前是否安装过,可以通过以下命令把旧版本的docker删除掉
apt-get remove docker docker-engine docker.io containerd runc
docker的旧版本不一定被称为docker,docker.io 或 docker-engine也有可能
2.需要对系统进行依赖项安装:
apt-get install ca-certificates curl gnupg lsb-release
3.添加Docker官方PGP密钥
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
4.添加Docker软件源
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
5.安装Docker
apt-get install docker-ce docker-ce-cli containerd.io
6.安装完成后启动Docker
systemctl start docker
systemctl restart docker
重启Docker
service docker restart
查看docker版本
docker -v
查看docker运行状态
systemctl status docker
7.配置镜像加速
docker官方镜像仓库网速较差,我们需要设置国内镜像服务:
参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
CentOS 系统
开始安装前:
1.更新本地软件源:
# 设置docker镜像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
1.安装docker
yum install -y docker-ce
2.安装完成后,需要关闭防火墙,以免端口无法访问:
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
3.启动与操作docker服务
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
4.配置镜像加速
docker官方镜像仓库网速较差,我们需要设置国内镜像服务:
参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
卸载
如果之前可能安装过docker,可以把docker卸载掉
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
Docker 基本操作
Docker 镜像操作基本命令
查看Docker现有的镜像
可以查看目前Docker下的所有镜像列表
docker images
删除 Docker 现有的镜像
通过镜像id或镜像名称删除,镜像名称由服务名+版本号构成,如 MySQL 的5.7版本,则镜像名为 MySQL:5.7
docker rmi Mysql:5.7
提交镜像到云端(或私服)
docker push
从云端拉取镜像到本地
docker pull
把镜像导出为一个 tar 文件
docker save -o Mysql.tar MySQL:5.7
把 tar 文件导入到Docker镜像中
docker load -i tar 文件
Docker 容器基本操作
创建镜像容器并运行
docker run
暂停镜像运行
docker pause
继续运行
docker unpause
停止镜像运行
docker stop
启动镜像运行
docker start
删除指定容器
会删除掉容器所生成的所有文件
docker rm
查看所有容器运行状态
docker ps
查看容器运行日志
可以查看指定容器中的应用在运行过程中输出的日志
docker logs name
持续监听日志输出:
docker logs -f name
执行容器命令
docker exec
进入容器,并创建一个cmd终端
docker exec -it name bash
-it: 表示构建一个标准输入输出
name : 表示容器名称
bash : 表示创建的终端为Linux 的bash终端
run 运行容器
run 命令相对比较复杂,我们在这一节中详细讲解 run 中的参数都表示什么
我们举一个简单的例子如下:
docker run --name containerName -p 80:80 -d nginx
--name xxx
当我们创建一个容器时,我们需要为这个容器声明一个全局唯的名称,以便快速找到这个运行中的容器,而 --name 则是指定一个容器名称的意思
-p 8080:80
-p 是让docker运行中的应用端口与宿主机端口进行绑定,以便外部通讯通过宿主机端口访问到docker内的应用
-p 前面的数字指宿主机的端口,-p 后面的数字指docker应用的端口
-d
使docker 应用处理后台运行状态
nginx:1.18.0
docker 镜像名称,如果不填写版本,默认是 nginx:latest
-e xxx=yyyy
声明环境变量值,即设置运行时给于应用的环境变量值
-v volune: path
声明数据卷挂载
docker命令一览表
命令
|
说明
|
文档地址
|
---|---|---|
docker pull
|
拉取镜像
|
|
docker push
|
推送镜像到DockerRegistry
|
|
docker images
|
查看本地镜像
|
|
docker rmi
|
删除本地镜像
|
|
docker run
|
创建并运行容器(不能重复创建)
|
|
docker stop
|
停止指定容器
|
|
docker start
|
启动指定容器
|
|
docker restart
|
重新启动容器
|
|
docker rm
|
删除指定容器
|
|
docker ps
|
查看容器
|
|
docker logs
|
查看容器运行日志
|
|
docker exec
|
进入容器
|
|
docker save
|
保存镜像到本地压缩文件
|
|
docker load
|
加载本地压缩文件到镜像
|
|
docker inspect
|
查看容器详细信息
|
数据卷
我们使用的很多容器应用,都需要存储属于它们自己的文件,如nginx的html目录,mysql中的data目录,但是如果这些目录存在于docker镜像中,是非常不可取的,因为它非常容易掉失,且与镜像容器高度耦合,我们需要在宿主机中创建一个目录,用于存储这些数据,这样当镜像发生错误或删除时,也不会造成使用数据的掉失。
数据卷,是一个虚拟目录,指向宿主机文件系统中的某个目录
基础命令
创建一个 volume
docker volume create name
name为数据卷的名称
显示一个或多个volume的信息
docker volume inspect name
name为数据卷的名称
列出所有的volume
docker volume ls
删除未使用的volume
docker volume prune
删除一个或多个指定的volume
docker volume rm name
name为数据卷的名称
挂载数据卷到容器中
在 run 命令中,我们只需要添加 -v 命令声明宿主目录与容器中的目录即可。
使用方法:
-v VolumeName: /taggetContainerPath
挂载目录
-v 宿主详细文件地址:容器文件地址
挂载的目录可以自定义为我们自己的文件目录或文件地址
例如:
docker run --name myNginx -p 8080:80 -v html:/var/share/nginx/html -d nginx
其中,左边的是指宿主机声明的数据卷名称,详细目录可以用docker volume inspect name 获取
右边是容器应用要挂载的目录地址。
注意:数据卷可以自动创建,所以在不事先创建的情况下声明挂载时,docker会自动创建对应的数据卷。
DockerFile 自定义镜像
镜像结构
Docker镜像是由这个应用所需要的系统函数库、环境、配置、依赖打包而成的,它是由系统,函数库,应用等多层组合而成的,如下图:
一个镜像由多个层的支持组成,我们称其为Layer.
BaseImage层:包含基本的系统函数库、环境变量、文件系统
Entrypoint层:入口,是镜像中应用启动的命令
其它:在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置。
DockerFile
DockerFile 就是一个文本文件,其中包含一个个的指令,用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer.
更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder
基本构建命令有如下:
FROM:
- 说明:指定基础镜像
- 示例:FROM ubuntu:20.04
ENV:
- 说明:设置环境变量,可在后面指令使用
- 示例:ENV key value
COPY:
- 说明:拷内本地文件到镜像的指定目录
- 示例:COPY ./mysql-5.7.rpm /tmp
RUN:
- 说明:执行Linux的shell命令,一般是安装过程的命令
- 示例:RUN yum install gcc
EXPOSE:
- 说明:指定容器运行时监听的端口,是给镜像使用者看的
- 示例:EXPOSE 8080
ENTRYPOINT:
- 说明:镜像中应用的启动命令,容器运行时调用
- 示例:ENTRYPOINT java -jar xx.jar
案例:基于Ubuntu镜像构建一个新镜像,运行一个java项目
步骤1.创建一个目录,用于存放必要的文件,包括java项目文仵、jdk运行库、DockerFile构建文件
步骤2.拷贝以上需要的文件。
步骤3.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
步骤4.使用命令构建镜像
docker build -t javaweb:1.0 .
说明:
- -t: 表示 tag. 就是这个镜像的名称
- 后面的 . 表示 DockerFile 构建文件在当前目录下,docker 需要获取到DockerFile文件进行构建。
基于java8构建项目的镜像
为了方便构建Java8的项目,我们不再需要做jdk的复制解压等工作了,由网友做好了一款带有Java8运行环境的镜像,我们可以直接使用这个镜像,就可以省去了搭建Java8环境的操作,DockerFile文件如下:
# 指定基础镜像
FROM java:8-alpine
# 配置环境变量,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
DockerCompose
DockerCompose 可以基于 Compose 文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!
Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。
基本配置示例如下:
version: "3.8"
services:
mysql: # mysql 的Docker容器名称
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: # web 镜像未被打包,dockerComponse 会自动找到 javaweb 文件夹下面的 DockerFile 文件进行构建
build: ./javaweb # DockerFile文件所在目录
ports: #设置端口映射
- "8090:8090"
说明:
- 1.services 下的名称,就是表示docker的 --name 容器名称
- 2.如果本身就有镜像的话,可以使用 image 属性定义镜像
- 3.设置环境变量使用 environment 属性,相当于docker中的 -e 参数
- 4.如果需要对容器中的数据卷做映射,可以使用 volumes 进行定义,和docker中的 -v 参数一样
- 5.如果镜像未进行打包,那么可以使用 build ./DockerFile 所在文件目录 属性来定义镜像构建,DockerCompose 会自动按照DockerFile文件进行打包成镜像,并装到docker中。
- 6.如果镜像需要使用端口映射,则可以使用 ports 属性定义,相当于 docker 中的 -p
微服务配置说明:
因为微服务将来要部署为docker容器,而容器之间互联不是通过IP地址,而是通过容器名。这里我们将order-service、user-service、gateway服务的mysql、nacos地址都修改为基于容器名的访问。
示例如下:
文件名为 docker-componse.yml
spring:
datasource:
url: jdbc:mysql://mysql:3306/cloud_order?useSSL=false #直接使用Docker容器名
username: root
password: 123
driver-class-name: com.mysql.jdbc.Driver
application:
name: orderservice
cloud:
nacos:
server-addr: nacos:8848 # nacos服务地址,直接使用Docker容器名
说明:当这些实例运行在Docker时,可以直接使用Docker中的容器名称作为ip连接
使用DockerCompose 进行一键打包并运行镜像:
docker-compose up -d
说明:up 是指让DockerComponse打包完后直接运行容器
DockerCompose的详细语法参考官网:https://docs.docker.com/compose/compose-file/
搭建私有Docker仓库
私服Docker仓库实际上也是一个Docker实例,实例名为 registry [docker pull registry]
国内有大神基于registry开发了一个带有UI可视化的私服Docker仓库管理
我们可以通过下面的代码进行构建并运行:
version: '3.0'
services:
registry:
image: registry # 私服Docker仓库官方镜像
volumes:
- ./registry-data:/var/lib/registry # 做数据卷映射
ui:
image: joxit/docker-registry-ui:static # 国内大神开发的UI界面镜像
ports:
- 8080:80 # 做端口映射
environment:
- REGISTRY_TITLE=Unsoft Docker # 【环境变量】运行时命令参数
- REGISTRY_URL=http://registry:5000 # 【环境变量】运行时命令参数
depends_on:
- registry
说明
1.http://registry:5000 说明,当实例在同一个Docker中运行时,我们可以直接通过Docker实例名访问
2.depends_on 表示这个实例需要依赖指定实例,只有指定实例运行完成后,才会运行这个实例。
配置Docker信任地址:
因为我们的私服仓库使用的是http不安全协议,这时如果前端UI把镜像推送给私服时,会推送不成功。所以我们需要让Docker接受http连接
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["前端ui仓库地址ip:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker
把镜像推送到私服仓库中:
1.需要把创库名称改为带有私服仓库的ip地址的仓库名:
docker tag nginx:latest 192.168.150.101:8080/nginx:1.0
2.使用 docker push 命令把镜像推送到 私服仓库
docker push 192.168.150.101:8080/nginx:1.0
3.使用 docker pull 命令在私服仓库中拉取镜像
docker pull 192.168.150.101:8080/nginx:1.0
使用Harbor搭建私服仓库
Harbor是VMware公司开源的企业级DockerRegistry项目,其目标是帮助用户迅速搭建一个企业级的Dockerregistry服务。它以Docker公司开源的registry为基础,提供了管理UI,基于角色的访问控制(Role Based Access Control),AD/LDAP集成、以及审计日志(Auditlogging) 等企业用户需求的功能,同时还原生支持中文。
下载地址:https://github.com/goharbor/harbor/releases
下载完成后对包中进行解压
tar -zxvf harbor-online-installer-v2.8.0.tgz # 解压tgz包
cp harbor.yml.tmpl harbor.yml # 创建一个配置文件
vim harbor.yml # 修改配置文件
安装Harbor
# 1、 进入到Harbor的解压目录
# 2、执行安装脚本
sh install.sh
可以在Docker中加入国内镜像地址:
// 编辑文件
vim /etc/docker/daemon.json
// 文件内容
{
"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","http://f1361db2.m.daocloud.io","https://mirror.ccs.tencentyun.com","https://phtv51hj.mirror.aliyuncs.com"]
}
启动 Harbor
docker compose -f docker-compose.yml up -d 启动 Harbor
docker compose -f docker-compose.yml stop 关闭 Harbor
访问Harbor
用户名/密码:admin/Harbor12345
为Docker添加安全仓库服务器地址
# 编辑/etc/docker/daemon.json文件
vim /etc/docker/daemon.json
# 添加安全访问权限
{
"insecure-registries":["http://192.168.6.131"]
}
# 重启Docker
systemctl restart docker
共有 0 条评论