文章目录
- Docker学习笔记
- 概念
- Docker与虚拟机
- 镜像和容器
- Docker架构
- 安装Docker
- Mysql部署
- Docker图形化界面
- 命令解读
- 常见命令
- docker pull 镜像名
- docker images
- docker save [options] image [image...]
- docker rmi 镜像名:版本(latest)
- docker load [-i 压缩文件地址] [-q ](-q指是否显示加载过程)
- docker ps 或 docker ps --format "table {\{.ID}}\t{\{.Image}}\t{\{.Ports}}\t{\{.Status}\t{\{.Names}}"
- docker stop 容器名
- docker start 容器名
- docker logs [-f] 容器名
- docker exec -it 容器名 bash
- docker rm 容器名
- Commit镜像
- 命令别名
- 数据卷
- 自定义镜像
- 网络
- docker0
Docker学习笔记
概念
Docker是一个快速交付应用、运行应用的技术:
- 可以将程序及其依赖、运行环境一起打包为一个镜像,
可以迁移到任意Linux操作系统 - 运行时利用沙箱机制形成隔离容器,各个应用互不干扰
- 启动、移除都可以通过一行命令完成,方便快捷
用白话来说就是,我们在部署项目到服务器时,很多应用(比如nodejs,redis等)可能依赖于不同的系统应用的系统函数库,而当你把应用镜像放到docker的时候,docker就会将其对系统依赖的函数库,配置,运行环境一起打包,且他们之间互不影响。当我们要调用某个应用的时候,该应用的打包好的函数库会直接调用内核,内核再调用计算机硬件完成指令,不再关心系统应用的问题。
Docker与虚拟机
虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在Windows系统里面运行
Ubuntu系统,这样就可以运行任意的Ubuntu应用了。
特性 | Docker | 虚拟机 |
---|---|---|
性能 | 接近原生 | 性能较差 |
硬盘占用 | 一般为MB | 般为GB |
启动 | 秒级 | 分钟级 |
Docker和虚拟机的差异:
- docker是一个系统进程;虚拟机是在操作系统中的操作系统
- docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般
镜像和容器
镜像(Image):Docker>将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。
DockerHub(镜像共享平台)
- DockerHub:DockerHub是一个Docker镜像的托管平台。这样的平台称为Docker Registry。
- 国内也有类似于DockerHub的公开服务,比如网易云镜像服务、阿里云镜像库等。
Docker架构
Docker是一个CS架构的程序,由两部分组成:
- 服务端(server’):Docker守护进程,负责处理Docker指令,管理镜像、容器等。
- 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。
安装Docker
1.1.卸载(可选)
如果之前安装过旧版本的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
1.2.安装docker
首先需要大家虚拟机联网,安装yum工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
然后更新本地镜像源:
# 设置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
然后输入命令:
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
docker-ce为社区免费版本。稍等片刻,docker即可安装成功。
1.3.启动docker
Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!
启动docker前,一定要关闭防火墙后!!
启动docker前,一定要关闭防火墙后!!
启动docker前,一定要关闭防火墙后!!
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
通过命令启动docker:
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
然后输入命令,可以查看docker版本:
docker -v
如图:
1.4.配置镜像加速
docker官方镜像仓库网速较差,我们需要设置国内镜像服务:
参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
对于CentOS:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://p4nhr5yg.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Mysql部署
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql
部署完之后,我们使用Navicat尝试连接数据库
镜像仓库:存储和管理镜像的平台,Docker官方维护了一个公共仓库:Docker Hub。
Docker图形化界面
在linux终端运行
docker run -d --name pointainer -p 8088:9000 \-v /var/run/docker.sock:/var/run/docker.sock --restart always portainer/portainer
命令解读
-
docker run :创建并运行一个容器,-d 是让容器在后台运行
-
–name mysql:给容器起个名字,必须唯一
-
-p 3306:3306:设置端口映射(多个实例下,前一个容器的端口不同,镜像的端口相同)
-
-e KEY=VALUE:是设置环境变量
-
mysql:指定运行的镜像的名字{
镜像名称一般分两部分组成:[repository]:[tag]。
-
其中repository就是镜像名
-
tag是镜像的版本
在没有指定tag时,默认是latest,代表最新版本的镜像
-
常见命令
docker pull 镜像名
从远程仓库拉取镜像到本地
docker images
查看本地有哪些镜像存在
docker save [options] image [image…]
将本地镜像打包成tar文件,方便其他用户安装
docker rmi 镜像名:版本(latest)
删除指定版本的镜像
docker load [-i 压缩文件地址] [-q ](-q指是否显示加载过程)
安装本地镜像
docker ps 或 docker ps --format “table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}\t{{.Names}}”
查看本地有哪些容器正在运行
-a 参数 同时展示所以已经停止的容器
docker stop 容器名
停止指定容器
docker start 容器名
启动指定容器
docker logs [-f] 容器名
查看指定容器产生的日志,-f 持续跟踪日志,一般用于调试过程
docker exec -it 容器名 bash
进入指定容器,相当于生成了一个独立的内部命令行
通过进入容器内部,可以实现修改服务的配置文件
使用exit命令退出
docker rm 容器名
删除指定容器,注意删除时,容器必须处于停止状态。可以通过 -f选项强制删除
Commit镜像
将容器提交,形成一个新的镜像
docker commit -m="提交的信息" -a="作者" 容器id 镜像名:[版本]
命令别名
vi ~/.bashrc
别名设置:
alias 键=值
值是字符串类型
改完之后,需要让这个文件生效,使用命令:
source ~/.bashrc
数据卷
**数据卷(volume)**是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。
一句话:容器的持久化和同步化
当我们的数据卷形成后,假如宿主机是Linux虚拟机,那么会在其文件系统的/var/lib/docker/volume下生成对应的数据卷,并绑定到旗下的_data文件目录。一旦桥梁形成之后,双方是双向绑定的,也就是说我们不必在容器内修改静态资源了,只需要在宿主机文件系统内修改就行。
命令 | 说明 |
---|---|
docker volume create | 创建数据卷 |
docker volume ls | 查看所有数据卷 |
docker volume rm 数据卷名 | 删除指定数据卷 |
docker volume inspect 数据卷名 | 查看某个数据卷的详情 |
docker volume prune | 清除数据卷 |
- 在执行docker run命令时,使用**-v 数据卷名或宿主机目录:容器内目录**可以完成数据卷挂载
- 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
自定义挂载位置
-
在执行docker run命令时,使用**-v 本地目录:容器内目录**可以完成本地目录挂载
-
本地目录必须以“”或“”开头,如果直接以名称开头,会被识别为数据卷而非本地目录
-v mysql:var/Iib/mysql会被识别为一个数据卷叫mysql
-v./mysql:Nar/Iib/mysql会被识别为当前目录下的mysql目录
扩展:
# 通过 -v 容器内路径: ro rw 改变读写权限 ro readonly # 只读 rw readwrite # 可读可写 # 一旦这个了设置了容器权限,容器对我们挂载出来的内容就有限定了! docker run -d -P --name nginx02 -v juming-nginx: /etc/nginx:ro nginx docker run -d -P --name nginx02 -v juming-nginx: /etc/nginx:rw nginx # ro 说明只能通过宿主机操作,不能在容器内操作
自定义镜像
镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。
镜像结构
Dockerfile
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。常见指令如下:
指令 | 说明 | 示例 |
---|---|---|
FROM | 指定基础镜像 | FROM centos:6 |
ADD | 添加压缩包 | ADD tomcat |
ENV | 设置环境变量,可在后面指令使用 | ENV key value |
COPY | 拷贝本地文件到镜像的指定目录 | COPY ./jrel1.tar.gz /tmp |
RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN tar -zxvf /tmp/jrel1.tar.gz&EXPORTS path=/tmp/jre11:$path |
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
MAINTAINER | 指定镜像的作者,格式:姓名+邮箱 | MAINTAINER gunala3485***[email protected] |
CMD | 指定这个容器启动时的命令,只有最后一个生效,可被督代 | CMD echo “start” |
更多语法详情可以参照:https://docs.docker.com/engine/reference/builder
例如:
#基础镜像
FROM openjdk:11.0-jre-buster
#拷贝jar包
COPY docker-demo.jar /app.jar
#入口
ENTRYPOINT ["java","-jar","/app.jar"]
当编写完Dockerfile后,使用以下命令构建镜像:
docker build -f Dockerfile文件地址 -t 镜像名[:版本] 生成的文件路径
- -t:是给镜像起名,格式依然是repository:tag的格式,不指定tag时,默认为latest
- . :是指定Dockerfile所在目录,如果就在当前目录则指定为"."
网络
默认情况下,docker中的容器是以bridge(网桥)的方式互通的。但是当我们的服务重新启动后,我们的容器的ip地址会发生变换,可能会被其他容器占用ip地址。
docker0
1、 我们每启动一个docker 容器 , docker就会给docker容器分配一个ip ,我们只要安装了 docker ,就会有一个网卡 docker0
桥接模式 ,使用的技术是 evth-pair 技术!
通过再次测试ip addr
当我们每次启动一个容器,虚拟网卡docker0就会给该容器分配一个新的网卡
自定义网络
自定义网络可以使docker内的容器互相访问
命令 | 说明 |
---|---|
docker network create | 创建一个网络 |
docker network ls | 查看所有网络 |
docker network rm | 删除指定网络 |
docker network prune | 清除未使用的网络 |
docker network connect [OPTIONS] NETWORK CONTAINER | 使指定容器连接加入某网络 |
docker network disconnect | 使指定容器连接离开某网络 |
docker network inspect | 查看网络详细信息 |
在run容器的时候,将统一项目所需的容器都放在同一network下
网络连通
docker中两个不同网段下的容器直接不能ping通,如果想要相互访问,需要将该网段下的指定勇气加入到另一个网段下