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). 连接操作

  1. 获取 linux ip
ip addr
  1. 连接《 以 finalshell 为例 》
第一步:
第二步:

  1. 连接《 以 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

image

2. 给镜像打标签

(1)查看镜像

如图: 本地已经下载好了两个镜像 “mysql” 和 “redis”
image

(2) 给镜像打标签

# docker tag <本地镜像名>:<标签>  <远程仓库名>/<自定义镜像名>:<自定义标签>
docker tag redis:latest codegjj/redis:7.x

(3) 上传到仓库

上传成功后, 远程仓库就会出现。如下图所示:

# docker push 你的名字/镜像名字:标签
docker push codegjj/redis:7.x

image

六. 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)创建容器

1. “镜像” 运行后便成为 “容器”
2. “一个镜像” 可以运行成 “多个容器”, 只需运行的时候换一个容器名即可。

# 运行镜像的命令
# 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. 方式一: 先创建再进入
# 1. 创建
docker run -id --name=centos_02 centos:centos7

# 2. 进入
# docker exec -it 容器id /bin/bash
docker exec -it 90fd0665494f /bin/bash
# /bin/bash 相当于起了一个前台进程(将其阻塞),防止退出容器后,容器就停止了。
  1. 方式二: 创建并进入
# 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容器

1. 启动的 mysql 用户默认是:root 密码默认是:123456
2. -p 端口映射,映射时需注意端口是否被占用
# 远程连接 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) 文件(配置)映射 - 部署

做好映射即便删除了 MySQL容器 也没事。
"""-----------宿主机中完成, 按照下面三步骤完成映射-----------"""

# 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) 构建镜像

  1. 创建 Dockerfile 文件
    文件名必须是 Dockerfile, 否则创建时指定文件名。

  2. 写入内容

# 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
  1. 基于 Dockerfile 文件创建镜像
# docker build -t <image_name> <dockerfile_path>
# centos_lqz_vim  : 构建后的镜像名
# .               : 基于当前路径下的 Dockerfile 构建,
docker build -t='centos_lqz_vim' .

八. 项目上线小案例

  1. 在宿主机上下载 git
yum install git
  1. 拉取代码
git clone <项目地址>
  1. 在项目中创建 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"]

image

  1. 基于 Dockerfile 创建镜像
docker build -t='books_text' .
  1. 基于 镜像 运行成容器
# --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
posted @ 2023-07-29 14:34  codegjj  阅读(113)  评论(0)    收藏  举报