docker基础篇
一. docker简介
1. docker和虚拟机
(1). 两者比较
| 特性 | docker | 虚拟机 |
|---|---|---|
| 性能 | 接近原生 | 性能较差 |
| 启动 | 秒级 | 分钟级 |
| 隔离 | 进程之间的隔离 | 系统级别的隔离 |
docker:
虚拟机:
(2). docker
-
Docker 是基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。
-
由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd。
-
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
(3). 虚拟机
-
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程。
-
而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
2. 容器和镜像
镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。
3. dacker架构
二. 可视化软件 连接和配置
1. 配置虚拟机
买个阿里云服务器:按量付费 有ip。
centos7.9 系统
2. 远程连接
(1). 软件
| 软件 | 介绍 |
|---|---|
| finalshell | 免费的 |
| git bash | 免费的 |
| xshell | 收费 |
(2). 连接操作
- 获取 linux ip
ip addr
- 连接《 以 finalshell 为例 》
- 连接《 以 git bash 为例 》
直接输入下面命令即可
# ssh 用户名 @ 1中的ip
ssh root@10.0.0.110
三. docker 安装及运行
1. 安装
# 卸载:
yum remove docker docker-common docker-selinux docker-engine
rm -rf /var/lib/docker
# 安装
# 更新yum
yum update
# 下载一些依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加 aliyun 源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce -y
# 验证
docker -v
2. 运行 docker-ce
# 查看docker软件运行状态
systemctl status docker
# 启动docker
systemctl start docker
# 重启
systemctl restart docker
# 停止
systemctl stop docker
3. 配置国内源
# 创建文件夹, 如果有,就不需要创建了
sudo mkdir -p /etc/docker
# 修改文件内容 (第一步: ‘a’ 编写模式。第二步:esc 返回键,:wq 退出编辑)
vi /etc/docker/daemon.json
# 加入下面内容, 阿里云镜像加速地址。["https://x1566319.mirror.aliyuncs.com"]
# https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
{
"registry-mirrors": ["https://x1566319.mirror.aliyuncs.com"]
}
# 保存退出
systemctl daemon-reload # 重新加载docker配置
systemctl restart docker # 重启docker
四. docker镜像操作
# 0 搜索镜像
去网站搜:https://hub.docker.com/
使用命令行搜:docker search mysql
# 1 获取镜像,拉去镜像---》从register下载到本地--》阿里云镜像站--》加速拉取
docker pull mysql:5.7 # 下载mysql 5.7镜像
docker pull redis:latest # 下载redis最新的镜像
docker pull nginx:latest # 下载 nginx最新的镜像
docker pull centos:centos7 # 下载 nginx最新的镜像
# 2 查看镜像
docker images
# 3 删除镜像
docker rmi redis:latest
五. 上传镜像到仓库
1. 登录docker
# 输入下面命令后,然后输入 https://hub.docker.com/ 的账号和密码。
docker login

2. 给镜像打标签
(1)查看镜像
如图: 本地已经下载好了两个镜像 “mysql” 和 “redis”

(2) 给镜像打标签
# docker tag <本地镜像名>:<标签> <远程仓库名>/<自定义镜像名>:<自定义标签>
docker tag redis:latest codegjj/redis:7.x
(3) 上传到仓库
上传成功后, 远程仓库就会出现。如下图所示:
# docker push 你的名字/镜像名字:标签
docker push codegjj/redis:7.x

六. docker容器操作
1. 容器操作命令
(1) 常用命令
# 查看正在运行的容器
docker ps
# 查看所有容器
docker ps -a
# 查看最后一次运行的容器
docker ps -l
# 启动停止的容器
docker start id/名字(id或名字)
# 停止运行的容器
docker stop id/名字(id或名字)
# 停止所有在运行的容器
docker stop `docker ps -q`
# 删除容器
docker rm 容器id
# 删除所有容器
docker rm `docker ps -a -q`
# 查看宿主机端口占用情况
# 1. 下载 net-tools
yum install net-tools -y
# 2. 查看 例如:3307 端口
netstat -nlp | grep 3307
# 文件拷贝
# 1. 容器的文件copy到宿主机上(不是在容器内执行)
# docker cp 容器名称:容器目录 需要拷贝的文件或目录
docker cp 0a9633190cb9:/xx.txt /root/lqz/lqz.txt
# 2. 宿主机的文件copy到容器中
# docker cp 需要拷贝的文件或目录 容器名称:容器目录
docker cp /root/lqz/xx.txt 0a9633190cb9:/xx.txt
# 查看容器IP地址
# 1. 查看详情数据
docker inspect 容器名称
# 2. 查看个别数据
docker inspect 0a9633190cb9 --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
(2) 换源
1. 首先要进入容器内执行,保存目前源
mv /etc/apt/sources.list /etc/apt/sources.list.bak
2. 修改源
cat <<EOF >/etc/apt/sources.list
deb http://mirrors.ustc.edu.cn/debian stable main contrib non-free
deb http://mirrors.ustc.edu.cn/debian stable-updates main contrib non-free
EOF
3. 执行更新源
apt update
apt-get install vim
4.恢复源
mv /etc/apt/sources.list.bak /etc/apt/sources.list
2. 创建容器并运行 《 run 》
(1)创建容器
# 运行镜像的命令
# docker run -id --name=容器名 镜像名:镜像标签
docker run -id --name=centos_01 centos:centos7 # 容器 centos_01
# eg: 将 centos 再运行成一个新的容器
docker run -id --name=centos_02 centos:centos7 # 容器 centos_02
(2)进入容器内部
- 方式一: 先创建再进入
# 1. 创建
docker run -id --name=centos_02 centos:centos7
# 2. 进入
# docker exec -it 容器id /bin/bash
docker exec -it 90fd0665494f /bin/bash
# /bin/bash 相当于起了一个前台进程(将其阻塞),防止退出容器后,容器就停止了。
- 方式二: 创建并进入
# docker run -it --name=容器名 镜像名:镜像标签
docker run -it --name=centos_02 centos:centos7
(3)相关参数 -i -d -t --name -p -v
-i 表示运行容器
-d 以守护式容器在后台运行,用这个参数创建出来的容器,命令行还在宿主机上,没有进入到容器内部
-t 表示容器启动后会进入容器命令行。加入这参数后,容器创建就能登录进去。即分配一个伪终端。
--name 指定容器名字,如果不指定,会随机一个名字
-p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
eg: docker run -id --name=mysql5.7 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
-v 表示目录映射关系(前者是宿主机目录,后者是容器的目录),可以使用多个-v做多个目录或文件映射。
注意:最好做目录映射,在宿主机上做修改,然后共享到容器上
eg: docker run -id --name=centos77 -v /root/lqz:/lqz centos:centos7
3. mysql容器
# 远程连接 mysql
mysql -h ip地址 -P 3307 -uroot -p
# mysql的容器底层的操作系统是 debian 装软件需要用 apt-get
# update 防止乱下载东西,下载前执行。
apt-get update
apt-get install vim -y
(1) 创建 mysql 容器
# --name : 取别名。
# -p : 端口映射。 3307:宿主机端口,3306:mysql容器端口。
# MYSQL_ROOT_PASSWORD : 设置密码。
# mysql:5.7 : 镜像名:镜像标签
docker run -id --name=mysql5.7 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
(2) 文件(配置)映射 - 部署
"""-----------宿主机中完成, 按照下面三步骤完成映射-----------"""
# 1. 创建文件夹
mkdir /mysql
mkdir /mysql/conf.d
mkdir /mysql/data/
# 2. 添加配置
vim /mysql/my.cnf
# 下面是需要放入的内容
[client]
default-character-set=utf8
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
# 3. 创建 MySQL容器 并做好映射
docker run -di -v /mysql/data/:/var/lib/mysql -v /mysql/conf.d:/etc/mysql/conf.d -v /mysql/my.cnf:/etc/mysql/my.cnf -p 3306:3306 --name mysql5.7 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 和上面初始映射命令相同(主要在于文件配置的映射)
docker run -di -v /mysql/data/:/var/lib/mysql -v /mysql/conf.d:/etc/mysql/conf.d -v /mysql/my.cnf:/etc/mysql/my.cnf -p 3306:3306 --name mysql5.7 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
3. redis 部署
# 1. 创建文件夹
mkdir /redis/data
# 2. 添加配置
vim /redis/redis.conf
# 下面是需要放入的内容
bind 0.0.0.0
daemonize NO
protected-mode yes # 允许远程连接
requirepass 123456 # 设置密码
# 3. 创建 redis容器 并做好映射
# redis-server /etc/redis/redis.conf 是启动时运行的命令
docker run -id -p 6379:6379 --name redis -v /redis/redis.conf:/etc/redis/redis.conf -v /redis/data:/data redis redis-server /etc/redis/redis.conf
4. nginx 部署
# 1. 拉取nginx镜像
docker pull nginx
# 2. 运行成容器
docker run -id --name nginx -p 80:80 nginx
# 3. 做映射 文件目录:/usr/share/nginx/html
# (1)在宿主机 root 下创建 html 文件
mkdir html
# (2) 创建并映射
docker run -id --name nginx1 -p 80:80 -v /root/html:/usr/share/nginx/html nginx
七. 形成镜像方式
1. 方式一:docker.hub 拉取镜像
# docker pull 镜像名:标签
# eg:mysql镜像
docker pull mysql:5.7
2. 方式二: 容器保存为镜像
# 1. eg:运行一个centos容器
docker run -id --name centos_vim centos:centos7
# 2. 进入容器并安装 vim
docker exec -it a6e240 /bin/bash
yum install vim -y # 容器可能比较纯净,没有 yum,可以使用 apt-get install vim
# 3. 把容器做成镜像: docker commit 容器名(要打包的容器) 镜像名(打包后的镜像名)
docker commit <container_name: 要打包的容器> <image_name:打包后的镜像名>
# 4. 把centos_vim 容器删除
docker rm centos_vim -f
# 5. 基于新构建的镜像,运行成容器
docker run -id --name centos_vim centos_vim_image:latest
# 6. 进入到容器中,查看,软件都在。
docker exec -it c3e633bd1 /bin/bash
3. 方式三: 镜像备份和恢复
# 1. 打包(压缩)
docker save -o centos_vim_image.tar centos_vim_image
# 2. 删除容器,删除镜像
命令:略
# 3. 把备份的镜像恢复(解压)
docker load -i centos_vim_image.tar
4. 方式四: Dockerfile (常用)
Dockerfile是由一系列命令和参数构成的脚本文件,这些命令应用于基础镜像并最终创建一个新的镜像。
(1) 常用命令
| 名称 | 解释 | 是否必选 | |
|---|---|---|---|
| FROM | 指定以哪个镜像构建新镜像,必需是首条命令 | 是 | |
| RUN | 构建镜像过程中需要执行的命令。可以有多条。 | 否 | |
| CMD | 启动容器时需要执行的命令。多条只有最后一条生效。可以在启动容器时被覆盖和修改。 | 否 | |
| ENTRYPOINT | 同CMD,但这个一定会被执行,不会被覆盖修改。 | 否 | |
| EXPOSE | 设置对外暴露的端口。 | 否 | |
| ENV | 设置执行命令时的环境变量,并且在构建完成后,仍然生效。 | 否 | |
| ARG | 设置只在构建过程中使用的环境变量,构建完成后,将消失。 | 否 | |
| ADD | 将本地文件或目录拷贝到镜像的文件系统中。能解压特定格式文件,能将URL作为要拷贝的文件。 | 否 | |
| COPY | 将本地文件或目录拷贝到镜像的文件系统中。 | 否 | |
| USER | 设置对外暴露的端口。 | 否 | |
| WORKDIR | 设置工作目录,进去容器后所在的目录。 | 否 | |
| MAINTAINER | 指定作者,国际标准为姓名加邮箱。 | 否 | |
| VOLUME | 添加数据卷。 | 否 |
1. ADD 和 COPY 区别
ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
ADD 的优点:在执行 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到目标路径。
ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
1. RUN
RUN可以执行多条。 分开执行时,每执行一条RUN命令,就会分一层。(建议不要分层)
# 分层
RUN yum install vim -y
RUN mkdir /lqz
RUN touch /lqz/ss.py
RUN echo 'print(1)' > /lqz/ss.py
# 不分层 : 使用 `&&` 符连接 `\` 符换行
RUN yum install vim -y && mkdir /lqz && \
touch /lqz/ss.py && echo 'print(1)' > /lqz/ss.py
(2) 构建镜像
-
创建 Dockerfile 文件
文件名必须是Dockerfile, 否则创建时指定文件名。 -
写入内容
# eg: 基于 centos7 创建
FROM centos:centos7
MAINTAINER lqz
ENV name lqz
RUN yum install vim -y
RUN mkdir /lqz
RUN touch /lqz/ss.py
RUN echo 'print(1)' > /lqz/ss.py
COPY ./aa.txt /lqz/aa.txt
WORKDIR /lqz
- 基于
Dockerfile文件创建镜像
# docker build -t <image_name> <dockerfile_path>
# centos_lqz_vim : 构建后的镜像名
# . : 基于当前路径下的 Dockerfile 构建,
docker build -t='centos_lqz_vim' .
八. 项目上线小案例
在宿主机上下载 git
yum install git
拉取代码
git clone <项目地址>
- 在项目中创建
Dockerfile文件,内容如下:
FROM python:3.10
MAINTAINER lqz
WORKDIR /soft
COPY ./requirements.txt /soft/requirements.txt
RUN pip install -r requirements.txt -i https://pypi.doubanio.com/simple
CMD ["python","manage.py","runserver","0.0.0.0:8080"]

- 基于
Dockerfile创建镜像
docker build -t='books_text' .
- 基于
镜像运行成容器
# --name=books_01 形成的容器名为 books_01
# -v /root/mytext/books:/soft 目录映射
# /root/mytext/books : 宿主机中项目所在的目录
# /soft : 容器中项目所在的目录
docker run -id --name=books_01 -v /root/mytext/books:/soft -p 8080:8080 books_text:latest
九. 私有仓库
1. harbor
企业级私有仓库, 有图形化界面, 和hub.docker。
地址:https://blog.csdn.net/weixin_47085247/article/details/129237979
2. registry
用docker搭建私有仓库, 没有图形化界面。
搭建步骤如下:
# 1. 拉取镜像 registry
docker pull registry
# 2. 运行成容器
docker run -di --name=registry -p 5000:5000 registry
# 3. 打开浏览器 输入地址:http://10.0.0.110:5000/v2/_catalog
看到 {"repositories":[]} 表示私有仓库搭建成功, 并且内容为空
# 4. 修改daemon.json
# 打开文件
vi /etc/docker/daemon.json
# “追加”代码
{
#"insecure-registries":["<本地ip:端口>"]
"insecure-registries":["192.168.1.250:5000"]
}
# 5. 重启docker 让配置生效
systemctl restart docker
docker start registry
# 6. 打标签
# docker tag <本地镜像名>:<标签> <本地ip:端口>/<自定义镜像名>:<自定义标签>
docker tag nginx:latest 192.168.1.250:5000/nginx:lat
# 提交到仓库
docker push 192.168.1.250:5000/nginx:lat

浙公网安备 33010602011771号