一、docker概述
1.docker是什么
-
是一个开源的应用容器引擎,基于go语言开发并遵循apache2.0协议开源
-
是在Linux容器里运行应用的开源工具
-
是一种轻量级的 “虚拟机”
-
Docker的容器技术,可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器
2.docker的优点
- 达到应用组件级别的“一次封装,到处运行”的目的。
- 这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作
- 跨平台一致性
- 资源隔离
- 轻量级资源占用,和传统虚拟机相比,docker容器共享虚拟机内核
3.docker的架构
-
镜像(image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
-
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停
-
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
4.容器概念的两个重要技术
Docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资
源限制 ,通过**写时复制技术(copy-on-write)**实现高效文件操作 (类似于虚拟机的磁盘,比如分
配500g并不是实际占用物理磁盘500g,只有当需要修改时才复制一份数据)
二、docker安装
1.centos装docker
先删除旧版本docker
yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
-
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-utils:提供了 yum-config-manager 工具。
device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
-
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
设置阿里云镜像,官方源比较慢
-
yum install -y docker-ce docker-ce-cli containerd.io
docker-ce 社区版
docker-ce-cli 客服端命令行工具
containerd.io 一个容器运行时接口的实现,管理容器的启动,创建,删除,停止等操作
docker-compose-plugin 和K8s一样是容器编排工具,不过前者适合开发测试小规模环境,K8s适合大规模
-
systemctl start docker.service systemctl enable docker.service
开启服务和打开服务自启动
docker version
2. 内网装docker+docker-compose
- 下载docker源码
https://download.docker.com/
按需下载
- 将下载好的的包上传到对应服务器
解压
tar -zxvf docker-26.1.4.tgz
解压完之后的文件夹是docker
- 移动到可执行文件目录下
mv docker/* /usr/bin/
- 配置docker.service
vim /usr/lib/systemd/system/docker.service
将下面的内容填进去
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s[Install]
WantedBy=multi-user.target
- 启动docker服务并开启自启动
systemctl daemon-reload
systemctl start docker.service
docker info
systemctl enable docker
如果习惯用容器编排,附带docker-compose
下载地址
curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-Linux-x86_64 -o /usr/bin/docker-compose
github连不上用这个地址 curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-
uname -s
-uname -m
> /usr/bin/docker-compose
给他可执行的权限
sudo chmod +x /usr/bin/docker-compose
检查是否成功安装
docker-compose --version
### 3. 配置加速器
-
配置阿里云镜像加速
-
登录我们的阿里云控制台,然后找到容器镜像服务**
-
找到镜像加速器---->镜像加速地址
-
选择对应的加速地址
-
-
配置别的加速器地址
网上直接搜,加速器地址存活周期不一定
搜到之后
vim /etc/docker/daemon.json
复制进去即可
4. 删除docker
- 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
- 删除资源
rm -rf /var/lib/docker
三、常用基础命令
1.查看镜像
docker images
2.查看容器
docker ps -a # -a参数是显示所有容器包括隐藏的
3.下载镜像
docker pull
docker pull nginx:1.22-alpine
docker search 查找镜像
latest 最新版本
stable 稳定版本
nginx:1.20.2 指定版本
默认是latest 最新版本 ,若要指定版本 可在pull 后要下载的加上版本号
例子:
docker pull mysql:8.4.3
4.运行镜像(没下载会自动下载)
docker run
例子:
# 指定配置文件目录,root密码
docker run -d --name mysql8.4.3 -v /usr/local/mysql-docker/conf/:/etc/mysql/conf.d -v /usr/local/mysql-docker/data/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin@123 -p 3307:3306 mysql:8.4.3
-d 容器以守护进程的方式运行
–name 指定容器的名称 方便docker start stop ,不用容器ID了太难记
-v 数据卷挂载
-e root的mysql密码
-p 端口内外部映射
mysql:8.4.3 运行的名字和版本 如果镜像仓库没有自动下载
5.删除镜像
docker rmi image名字
6.删除容器
docker rm 容器名字或者id
7.容器管理
docker create 创建容器 --name
docker start 启动容器
docker stop 停止容器
docker restart 重启容器
docker kill 强制停止容器
docker rm 删除容器
批量删除所有容器 docker rm -f `docker ps -a -q`
8.查看容器状态
docker status
单独查看某一进程的信息
docker top mysql8.4.3
9.根据容器生成镜像
和git
原理差不多,比如有的nginx的配置文件结构不好,你以后生成的容器是修改过后的conf文件,添加之后,把这个容器生成一个镜像,后边的都是容器了
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
10.IP绑定端口
显示用户只能通过宿主机的某个网卡连接这个端口
docker run -d --name "nginx_bind_ip" -p 172.16.1.81:12306:80 nginx:1.20.2-alpine
11.查看容器信息
docker inspect 容器名字或者id
加| jq .[].HostConfig.Binds
能看到挂载的目录端口还有容器网络啥的
12.查看容器日志
docker logs -n 容器名
13. 容器主机直接拷贝文件
docker cp
例子:
docker exec -it 6eda31ad7987 /bin/bash,先进入到容器内部docker cp 6eda31ad7987:/home/test.java /home
14. sl大法(复制镜像可建立远程docker仓库)
docker image save -o XXXX#docker save
docker image load -i #docker load
四、docker装各种服务
1. docker装mysql(8.4.3)
- 拉去镜像
docker pull mysql:8.4.3
- 运行起来
docker run -d --name mysql8.4.3 -v /usr/local/mysql-docker/conf/:/etc/mysql/conf.d -v /usr/local/mysql-docker/data/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin@123 -p 3307:3306 mysql:8.4.3
-d 容器以守护进程的方式运行
–name 指定容器的名称 方便docker start stop ,不用容器ID了太难记
-v 数据卷挂载
-e root的mysql密码
-p 端口内外部映射
mysql:8.4.3 运行的名字和版本 如果镜像仓库没有自动下载
- 进入容器
docker exec -it mysql8.4.3 bash
- 登录mysql
mysql -uroot -p
- 编写配置文件
cd /usr/local/mysql-docker/conf
vim my.cnf
编辑内容如下
[mysqld]port=3306datadir=/var/lib/mysqlmax_allowed_packet=1024Mmax_connections=1000# 默认字符集character-set-server=utf8mb4collation-server=utf8mb4_general_ci# binlog日志server-id=2018log-bin=mysql-bin# 保存15天binlog_expire_logs_seconds=1296000# 选择 binlog 文件的最大大小,达到该大小时会自动切换到新的日志文件max-binlog-size=100M# 记录 binlog 文件时排除某些查询binlog-ignore-db=information_schemabinlog-ignore-db=performance_schemabinlog-ignore-db=mysql
2.docker装nginx
- 拉去镜像
docker pull nginx:1.26.2
- 创建挂载目录
创建挂载目录
mkdir -p /usr/local/nginx-docker/conf
mkdir -p /usr/local/nginx-docker/conf/conf.d
mkdir -p /usr/local/nginx-docker/log
mkdir -p /usr/local/nginx-docker/html
- 生成容器迁移配置文件
#生成容器
docker run --name nginx --restart=always -p 80:80 -d nginx:1.26.2
#将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /usr/local/nginx-docker/conf/nginx.con
#将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /usr/local/nginx-docker/conf/conf.d
#将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html /usr/local/nginx-docker/
创建Nginx容器并运行
#直接执行docker rm nginx或者以容器id方式关闭容器
#找到nginx对应的容器id
docker ps -a
#关闭该容器
docker stop nginx
#删除该容器
docker rm nginx
#删除正在运行的nginx容器
docker rm -f nginx
- docker 创建nginx容器
docker run \
-p 80:80 \
--name nginx \
-v /usr/local/nginx-docker/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/nginx-docker/conf/conf.d:/etc/nginx/conf.d \
-v /usr/local/nginx-docker/log:/var/log/nginx \
-v /usr/local/nginx-docker/html:/usr/share/nginx/html \
--restart=always \
-d nginx:1.26.2
docker run
-p 80:80
-p 443:443
–name nginx
-v /usr/local/nginx-docker/conf/nginx.conf:/etc/nginx/nginx.conf
-v /usr/local/nginx-docker/conf/conf.d:/etc/nginx/conf.d
-v /usr/local/nginx-docker/log:/var/log/nginx
-v /usr/local/nginx-docker/html:/usr/share/nginx/html
-d nginx:1.26.2有多少端口就在这里面加就行
命令 | 描述 |
---|---|
–name nginx | 启动容器的名字 |
-d | 后台运行 |
-p 80:80 | 映射端口 |
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf | 挂载nginx.conf配置文件 |
-v /home/nginx/conf/conf.d:/etc/nginx/conf.d | 挂载nginx配置文件 |
-v /home/nginx/log:/var/log/nginx | 挂载nginx日志文件 |
-v /home/nginx/html:/usr/share/nginx/html | 挂载nginx内容 |
nginx:latest | 本地运行的版本 |
\ | shell 命令换行 |
https://download.docker.com/ 下载docker
3.内网docker装oracle
一、内网装dorcker
- 下载docker源码
https://download.docker.com/
按需下载
- 将下载好的的包上传到对应服务器
解压
tar -zxvf docker-26.1.4.tgz
解压完之后的文件夹是docker
- 移动到可执行文件目录下
mv docker/* /usr/bin/
- 配置docker.service
vim /usr/lib/systemd/system/docker.service
将下面的内容填进去
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s[Install]
WantedBy=multi-user.target
- 启动docker服务并开启自启动
systemctl daemon-reload
systemctl start docker.service
docker info
systemctl enable docker
如果习惯用容器编排,附带docker-compose
下载地址
https://github.com/docker/compose/releases/latest/download/docker-compose-Linux-x86_64
给他可执行的权限
sudo chmod +x /usr/bin/docker-compose
检查是否成功安装
docker-compose --version
二、安装docker-oracle
-
上传docker-oracle镜像包
-
导入镜像包
docker load -i 镜像包
- 执行
docker images
检查是否存在镜像oracle:oracle11g
存在则导入成功
- 创建并启动容器
docker run -itd \--name oracle11g \-p 1521:1521 \-p 5500:5500 \--mount source=oracle_vol,target=/opt/oracle/app/oradata \-e ORACLE_HOME=/opt/oracle/app/product/11.2.0/dbhome_1 \-e ORACLE_SID=ORCL \-e PATH=$ORACLEHOME/bin:PATH \--restart always \yycx/oracle11 挂载的数据有点大 run的时候可能会比较慢,如果只是为了测试搭建,可以不挂载数据持久化
-p 宿主机映射端口:docker端口
–name 容器的名字
–restart=alway 开机自启动
–mount source=oracle_vol,target=/opt/oracle/app/oradata \ 挂载磁盘实现数据持久化
-e ORACLE_SID=ORCL \ 实例名字用来连接的
#新建docker卷-----docker volume create oracle11g
#查看docker卷-------docker volume ls
#卷路径-------find / -name oracle11g
这个卷的路径就是数据持久化存放的位置
- 进入容器进行配置
docker exec -it oracle11g bash
- 创建软连接
ln -s $ORACLE_HOME/bin/sqlplus /usr/bin
#可以全局使用sqlplus
- 登录Oracle的一些初始化操作
su - oracle 切换oraclesqlplus /nolog 启动sqlplus但不立即登录数据库connect /as sysdba 以sysdba去登录oraclealter user system identified by nomax; 修改system的密码是nomax
alter user sys identified by nomax; 修改sys 的密码是nomax
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; 配置密码不过期
alter system set processes=1000 scope=spfile; 修改最大连接数是1000
sqlplus /nolog 启动sqlplus但不立即登录数据库
connect /as sysdba 以sysdba去登录
alter user system identified by nomax; 设置system的密码是nomax
alter user sys identified by nomax; 设置sys的密码是nomaxALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; 配置密码不过期
- 创建用户并指定表空间,授权
SQL> create user nomax IDENTIFIED BY nomax default tablespace nomax;User created.SQL> grant connect,resource,dba to nomax;Grant succeeded.创建一个nomax的用户,分配表空间nomax,密码是nomax,授予他connect,resource,dba的权限
题外话:
conn /as sysdba;
shutdown immediate; --关闭数据库
startup; --启动数据库
show user;
修改密码的时候会出现:database not open
- 提示数据库没有打开
输入:alter datebase open
还有出现:datebase not mountd
- 提示数据库没有被挂载
输入:alter database mount;
输入:alter database open;
这个没被挂载是因为宿主机和docker 挂载磁盘出现的问题,有可能是权限dockers的oracle没有权限存放到映射的宿主机目录,也有可能是操作问题,本来我是直接-v映射的,但是一直出现这个问题,后来索性用了挂载volume卷,解决了。
4. docker装tomcat
- 拉镜像
tomcat
docker pull tomcat:7.0
- 创建宿主机映射目录
mkdir -p /usr/local/docker-tomcat/webapps/
mkdir -p /usr/local/docker-tomcat/conf/
mkdir -p /usr/local/docker-tomcat/logs/
- run起来并配置数据持久化映射
docker run -di --name=tomcat -p 8080:8080 -p1521:1521 -v /usr/local/docker-tomcat/webapps/:/usr/local/tomcat/webapps/ -v /usr/local/docker-tomcat/conf/:/usr/local/docker-tomcat/conf/ -v /usr/local/docker-tomcat/logs/:/usr/local/docker-tomcat/logs/ tomcat:7.0
记得把tomcat连接的服务器的映射端口打开
- cp容器自带的文件到挂载磁盘
docker cp tomcat:/usr/local/tomcat/conf/* /usr/local/docker-tomcat/conf/
- 进入容器内
docker exec -it tomcat bashcd bin
启动tomcat
tomcat默认最小安装webapps下啥也没有
在tomcat目录下有一个
webapps.dist
目录,这个目录下有我们所需要的文件,也就是webapps目录所需要的文件,我们将这个文件中的内容全部拷贝到webapps下。cp -r webapps.dist/* webapps
五、容器编排技术
1.单机编排
docker镜像可以通过Dockerfile一键创建.
目前问题:⚠ docker容器的管理(启动,关闭,重启),需要手动执行,如何管理多个容器.
单机容器编排工具
docker compose
- 下载安装
yum install -y docker-compose
或者
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
官方文档下载 并放到bin下
给可执行权限
sudo chmod +x /usr/local/bin/docker-compose
- 验证
docker-compose --version
- 书写格式
compose.yaml
compose.yml
docker-compose.yaml
docker-compose.yml
默认支持的compose文件名.
services:mysql8.4.3:image: "mysql:8.4.3"environment:- MYSQL_ROOT_PASSWORD=admin@123volumes:- "./data:/var/lib/mysql"- "./conf:/etc/mysql/conf.d" container_name: mysql8.4.3 ports: - "3307:3306"restart: always
- 常用基本命令
- 启动服务
docker-compose up -d
-d 是在后台运行不占用终端
2.查看服务状态
docker-compose ps
3.停止服务
docker-compose down
4.删除服务
docker-compose stop 服务名字
docker-compose rm 服务名字
默认不会删除挂载的数据卷
docker-compose rm -v 服务名
加-v参数可一块删除挂载的数据卷
5.查看日志
docker-compose logs [service_name]
6.重建服务
修改完yml文件后执行docker-compose up -d [service_name]
六、Dockerfile 学习
什么是Dockerfile
Dockerfile 是一个文本文件,包含了构建 Docker 镜像的所有指令。
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
通过定义一系列命令和参数,Dockerfile 指导 Docker 构建一个自定义的镜像。
和commit生成的会变大,然后也没有dockerfile透明清除,但是commit根据已有的容器生成临时用比较方便
Dockerfile制定镜像
- 下面以定制一个 nginx 镜像(构建好的镜像内会有一个 /usr/share/nginx/html/index.html 文件)
在一个空目录下,新建一个名为 Dockerfile 文件,并在文件内添加以下内容:
FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
- FROM 和 RUN 指令的作用
FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。
RUN:用于执行后面跟着的命令行命令。有以下俩种格式:
注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum -y install wget \&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \&& tar -xvf redis.tar.gz
用&&
符号连接
- 开始构建镜像
在 Dockerfile 文件的存放目录下,执行构建动作。
以下示例,通过目录下的 Dockerfile 构建一个 nginx:v3(镜像名称:镜像标签)。
注:最后的 . 代表本次执行的上下文路径,下一节会介绍。
$ docker build -t nginx:v3 .
指令详解表:
Dockerfile 指令**** | 说明 |
---|---|
FROM | 指定基础镜像,用于后续的指令构建。 |
MAINTAINER | 指定Dockerfile的作者/维护者。(已弃用,推荐使用LABEL指令) |
LABEL | 添加镜像的元数据,使用键值对的形式。 |
RUN | 在构建过程中在镜像中执行命令。 |
CMD | 指定容器创建时的默认命令。(可以被覆盖) |
ENTRYPOINT | 设置容器创建时的主要命令。(不可被覆盖) |
EXPOSE | 声明容器运行时监听的特定网络端口。 |
ENV | 在容器内部设置环境变量。 |
ADD | 将文件、目录或远程URL复制到镜像中。 |
COPY | 将文件或目录复制到镜像中。 |
VOLUME | 为容器创建挂载点或声明卷。 |
WORKDIR | 设置后续指令的工作目录。 |
USER | 指定后续指令的用户上下文。 |
ARG | 定义在构建过程中传递给构建器的变量,可使用 “docker build” 命令设置。 |
ONBUILD | 当该镜像被用作另一个构建过程的基础时,添加触发器。 |
STOPSIGNAL | 设置发送给容器以退出的系统调用信号。 |
七、Docker命令大全
容器生命周期管理
语法 | 详细解释 |
---|---|
run起来 | run命令 |
开始暂停重启容器 | docker start/stop/restart 命令 |
docker kill 容器/id 强制杀死 | docker kill 命令 |
docker rm 容器 删除容器 | Docker rm 命令 |
暂停 | docker pause/unpause 命令 |
创建容器但不会运行 | Docker create 命令 |
进入容器内部 | Docker exec 命令 |
docker rename 当前容器名称或ID 新容器名称 | Docker rename 命令 |
网络命令
-
docker network ls
: 列出所有网络。 -
docker network create <network>
: 创建一个新的网络。 -
docker network rm <network>
: 删除指定的网络。 -
docker network connect <network> <container>
: 连接容器到网络。 -
docker network disconnect <network> <container>
: 断开容器与网络的连接。
卷命令
docker volume ls
: 列出所有卷。docker volume create <volume>
: 创建一个新的卷。docker volume rm <volume>
: 删除指定的卷。docker volume inspect <volume>
: 显示卷的详细信息。
https://www.runoob.com/docker/docker-rm-command.html) |
| 暂停 | docker pause/unpause 命令 |
| 创建容器但不会运行 | Docker create 命令 |
| 进入容器内部 | Docker exec 命令 |
| docker rename 当前容器名称或ID 新容器名称 | Docker rename 命令 |
网络命令
-
docker network ls
: 列出所有网络。 -
docker network create <network>
: 创建一个新的网络。 -
docker network rm <network>
: 删除指定的网络。 -
docker network connect <network> <container>
: 连接容器到网络。 -
docker network disconnect <network> <container>
: 断开容器与网络的连接。
卷命令
docker volume ls
: 列出所有卷。docker volume create <volume>
: 创建一个新的卷。docker volume rm <volume>
: 删除指定的卷。docker volume inspect <volume>
: 显示卷的详细信息。