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  阅读(47)  评论(0)    收藏  举报