docker

Docker

一、认识docker

  • Docker是一个开源的应用容器引擎
  • Docker让开发者可以打包他们的应用以及依赖包到一个轻量级可移植的容器中然后发布到任何流行的 Linux或Windows操作系统的机器上
  • 容器是完全使用沙箱机制,相互之间不会有任何接口,相互隔离

二、Docker架构

Docker使用C/S架构,Client 通过接口与Server进程通信实现容器的构建,运行和发布.client
和server可以运行在同一台集群,也可以通过跨主机实现远程通信。

image-20230507092144273

Docker技术的三大核心概念,分别是:

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repostitory)

Docker镜像(Image)

Docker 镜像(Image)就是一个只读的模板。例如:一个镜像可以包含一个完整的操作系统
环境,里面仅安装了 Apache 或用户需要的其它应用程序

  • 镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。Docker 提供了一个很简单的
    机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜
    像来直接使用。

  • 镜像(Image)就是一堆只读层(read-only layer)的统一视角

Docker容器(Container)

Docker 利用容器(Container)来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。我们可以把Image和Container的关系类比于面向对象中的类和对象的关系。

  • 可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
  • 创建Container首先要有Image,也就是说Container是通过image创建的。
    Container是在原先的Image之上新加的一层,称作Container layer,这一层是可读可写的(Image是只读的)。
    在面向对象的编程语言中,有类跟对象的概念。类是抽象的,对象是类的具体实现。Image跟Container可以类比面向对象中的类跟对象,Image就相当于抽象的类,Container就相当于具体实例化的对象。
    Image跟Container的职责区别:Image负责APP的存储和分发,Container负责运行APP

Docker仓库(Repostitory)

仓库(Repository)是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务(Registry)混为一谈,并不严格区分。

实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。
国内的公开仓库包括 阿里云 、网易云 等,可以提供大陆用户更稳定快速的访问。
当然,用户也可以在本地网络内创建一个私有仓库。
当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。

三、安装Docker

1.更新yum包

1
yum update

2.安装yum工具包和存储驱动

1
yum install -y yum-utils device-mapper-persistent-data lvm2

3.安装Docker的yum源

1
2
3
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.rep
如果连接超时,可以使用alibaba源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.rep

4.安装Docker

1
yum install -y docker-ce

5.查看Docker版本,验证是否安装成功

1
docker -v

三、Docker常用命令

Docker进程相关

启动Docker

1
sudo service docker start

设置开机启动

1
systemctl enable docker

查看Docker状态

1
systemctl status docker

Docker 启动和停止

image-20230507095109572

Docker镜像相关

查看镜像

1
docker images

REPOSITORY:镜像名称
TAG:镜像标签
IMAGE ID:镜像id
CREATED:镜像的创建日期(不是获取该镜像的日期)
SIZE:镜像大小

搜索镜像

网站:https://hub.docker.com

1
docker search 某个XXX镜像名字

NAME:镜像名称
DESCRIPTION:镜像描述
STARS:用户评价,反应一个镜像的受欢迎程度
OFFICIAL:是否官方
AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的

拉取镜像

  • 拉取镜像就是从中央仓库中下载镜像到本地,命令:
1
docker pull 镜像名字

拉取镜像的时候默认拉取最新的版本,如果想拉取指定版本的话,需要添加版本号信息,不指
定版本的话拉取的是latest这个版本的镜像。
拉取指定版本的时候追加版本信息(网站:https://hub.docker.com查找):docker pull centos:7

删除镜像

  • 删除单个镜像

    1
    docker rmi -f 镜像ID(IMAGE ID)
  • 删除多个镜像

    1
    docker rmi -f 镜像名1:TAG 镜像名2:TAG
  • 删除全部

    1
    docker rmi -f  'docker images -qa'

Docker容器相关

查看容器

  • 查看正在运行的容器

docker ps

  • 查看所有容器

docker ps -a

  • 查看最后一次运行的容器

docker ps -l

  • 查看停止的容器

docker ps -f status=exited

创建与启动容器

1
docker run
  • OPTIONS说明(常用):有些是一个减号,有些是两个减号

    –name=“容器新名字”: 为容器指定一个名称;
    -d: 在run后面加上参数-d,会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i-t两个参数,
    创建后会自动进入容器),并返回容器ID,也即启动守护式容器;
    -i:以交互模式运行容器,通常与 -t 同时使用;
    -t:表示容器启动后会进入其命令行,为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    -p: 表示端口映射,有以下四种格式
    ip:hostPort:containerPort
    ip::containerPort
    hostPort:containerPort
    containerPort
    前者表示宿主机端口,后者是容器内的映射端口,可以使用多个-p做多个端口映射

  • 启动交互式容器

    1
    2
    3
    4
    5
    docker run -it --name=centos 镜像名称:标签 /bin/bash
    exit 退出容器
    拉取centos:docker pull centos
    docker run -id centos /bin/bash 后台运行(不会直接进入容器,进入容器之后exit不会关闭容器)
    docker exec -it name /bin/bash 进入容器
  • 守护式方式创建容器

    1
    2
    3
    docker run -id --name=容器名称 镜像名称:标签后台运行(不会直接进入容器,进入容器之后exit不会关闭容器)
    docker run -id --name=mycentos2 centos:latest
    docker exec -it name /bin/bash 进入容器

/bin/bash的作用是因为docker后台必须运行一个进程,否则容器就会退出,在这里表示启动容
器后启动bash。

什么是守护式容器:

能够长期运行、没有交互式会话、适合运行应用程序和服务

  • 退出当前容器

exit

停止与启动容器

  • 停止容器

docker stop 容器名称(或者容器id)
docker stop mycentos2

  • 启动容器

docker start 容器名称(或者容器id)
docker start mycentos2

  • 重启容器

docker restart 容器名称(或者容器id)
docker restart mycentos2

  • 强制停止容器

docker kill 容器名称(或者容器id)
docker kill mycentos2

  • 删除容器(需先停止容器)

docker rm 容器名称(或者容器id)
docker rm mycentos2

docker rm ‘docker ps -aq’ 通过查询所有容器的id删除所有容器

  • 查看容器信息

docker inspect

配置阿里云镜像加速

登陆阿里云开发者平台(https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors)获取加速器地址

image-20230507094221339

四、Docker容器的数据卷

概念

思考:

  • Docker容器删除后,在容器中产生的数据会随之销毁
  • Docker容器和外部机器不可以直接交换文件
  • 容器之间数据交换

数据卷:

  • 数据卷是宿主机中的一个目录或文件
  • 当容器目录和数据卷绑定后,对方修改会立即同步
  • 一个容器可以挂载多个数据卷

数据卷作用:

  • 容器数据持久化
  • 外部机器和容器间接通信
  • 容器之间数据交换

配置数据卷

可以在创建容器的时候,将宿主机的目录和容器内的目录进行映射,这样就可以通过修改宿主机的某个目录的文件从而去影响容器。
创建容器添加-v参数,后边为宿主机目录:容器目录,例如:

1
2
3
4
docker run -it -v /root/data/:/root/data --name=c1 centos:7一个容器挂载一个数据卷
docker run -it --name=c2 -v /root/data/:/root/data -v /root/data1/:/root/data1 centos:7 一个容器挂载多个数据卷
docker run -it -v /root/data/:/root/data --name=c3 centos:7
docker run -it -v /root/data/:/root/data --name=c4 centos:7 多个容器挂载同一个数据卷

数据卷容器

多容器之间数据交换:

  1. 多个容器挂载同一个数据卷
  2. 数据卷容器

配置数据卷

1.创建启动数据卷容器c3,使用-v参数设置数据卷

1
docker run -it -v /volume --name=c3 centos:7 /bin/bash

2.创建启动容器c1,c2,使用–volumes-from参数设置数据卷

1
2
docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash

Docker 应用部署

MySQL 部署

image-20230507154827799
  • Docker hub上查找mysql镜像

docker search mysql

  • 从Docker Hub上(阿里云加速器)拉取mysql镜像到本地,标签为5.6

docker pull mysql:5.6

  • 创建容器,设置端口映射、目录映射
1
2
3
#在root目录下创建mysql目录用于存储mysql数据信息
mkdir ~/mysql
cd ~/mysql

docker run -id \

–name=c_mysql \

-p 3307:3306 \

-v $PWD/conf:/etc/mysql/conf.d \

-v $PWD/logs:/logs \

-v $PWD/data:/var/lib/mysql \

-e MYSQL_ROOT_PASSWORD=123456
mysql:5.6

-p 代表端口映射,格式为宿主机映射端口:容器运行端口
-e 代表添加环境变量,MYSQL_ROOT_PASSWORD是root用户的登录密码

1
2
docker exec -it c_mysql /bin/bash 进入mysql容器
mysql -uroot -p123456 进入mysql
  • 使用mysql客户端navicat连接

    注意这里端口已被映射为3307(一般我们映射3306)

tomcat 部署

  • Docker hub上查找tomcat镜像

docker search tomcat

  • 从Docker Hub上(阿里云加速器)拉取tomcat镜像

docker pull tomcat

  • 创建容器,设置端口映射、目录映射
1
2
3
#在root目录下创建tomcat目录用于存储tomcat数据信息
mkdir ~/tomcat
cd ~/tomcat

docker run -id \

–name=c_tomcat \

-p 8080:8080 \

-v $PWD:/usr/local/tomcat/webapps \

tomcat

Nginx 部署

  • Docker hub上查找Nginx镜像

docker search nginx

  • 从Docker Hub上(阿里云加速器)拉取Nginxl镜像到本地

docker pull nginx

  • 创建容器,设置端口映射、目录映射
1
2
3
4
5
6
7
#在root目录下创建nginx目录用于存储nginx数据信息
mkdir ~/nginx
cd ~/nginx
mkdir conf
cd conf
vim nginx.conf #nginx.conf事先准备用于粘贴
cd ..

docker run -id \

–name=c_nginx \

-p 80:80 \

-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \

-v $PWD/logs:/var/log/nginx \

-v $PWD/html:/usr/sharer/nginx/html \

nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# This is a sample Nginx configuration for Elefant.
# Add these to your server{} block, making sure to
# adjust the root path and add any additional
# configurations you require.

# Uncomment if required

## Fast-CGI cache settings
#fastcgi_cache_path /tmp levels=1 keys_zone=CACHE:16m inactive=24h;
#fastcgi_cache_key "$scheme$request_method$host$request_uri";
#
#set $nocache "";
#if ($http_cookie ~ (PHPSESSID)) {
# set $nocache "Y";
#}
## "elefant_user" should be replaced by value of session_name from config
#if ($http_cookie ~ (elefant_user)) {
# set $nocache "Y";
#}
#
#fastcgi_cache CACHE;
#fastcgi_cache_valid 200 302 1d;
#fastcgi_cache_valid 301 1d;
#fastcgi_cache_valid any 1m;
#fastcgi_cache_min_uses 1;
#fastcgi_cache_use_stale error timeout invalid_header http_500;
#fastcgi_ignore_headers Set-Cookie Expires Cache-Control;
#fastcgi_pass_header Set-Cookie;
#
#fastcgi_cache_bypass $nocache;
#fastcgi_no_cache $nocache;

location ^~ /conf/ {
deny all;
return 403;
}
location ~ ^/(cache|apps|tests|lib)/.*\.(php|sql)$ {
deny all;
return 403;
}
location ~ ^/files/.*\.(?!(gif|jpe?g|png|mp4|pdf))$ {
add_header Content-disposition "attachment";
}
location / {
root /var/www/nginx-default;
index index.php;
try_files $uri $uri/ /index.php?$args;
}

Redis 部署

  • Docker hub上查找redis镜像

docker search redis

  • 从Docker Hub上(阿里云加速器)拉取redis镜像

docker pull redis:5.0

  • 创建容器,设置端口映射

docker run -id \

–name=c_redis \

-p 6379:6379\

redis:5.0

  • 使用redis-cli连接

docker exec -it c_redis redis-cli

  • 打开redis客户端连接redis服务器

Dockerfile

Dockerfile概念

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像

对于开发人员:可以为开发团队提供一个完全一致的开发环境
对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作
对于运维人员:在部署时,可以实现应用的无缝移植

Docker镜像原理

image-20230507165351604

image-20230507165959629

Docker镜像制作

1.容器转为镜像

1
2
3
docker commit 容器id 镜像名称:版本号(镜像名称:版本号自定义)commit命令数据卷挂载内容消失
docker save -o 压缩文件名称 镜像名称:版本号(压缩文件名称自定义)#压缩镜像
docker load -i 压缩文件名称 #还原镜像

2.Dockerfile

DockerFile 常用命令

image-20230507182746068

FROM

指明构建的新镜像是来自于哪个基础镜像,例如:

FROM centos: latest

MAINTAINER

指明镜像维护者及其联系方式(一般是邮箱地址),例如:

MAINTAINER Rui Cheng chengrui.sk@gmail.com

不过,MAINTAINER并不推荐使用,更推荐使用LABEL来指定镜像作者,例如:

LABEL maintainer=“Rui Cheng”

ADD

拷贝文件或目录到镜像中,PS:如果是URL或压缩包,会自动下载或自动解压,例如:

ADD …
ADD html.tar.gz /var/www/html
ADD https://xxx.com/html.tar.gz /var/www/html

CMD

启动容器时执行的Shell命令,例如:

CMD [“-C”, “/start.sh”]
CMD [“/usr/sbin/sshd”, “-D”]
CMD /usr/sbin/sshd -D

EXPOSE

声明容器运行的服务端口,例如:

EXPOSE 80 443

COPY

拷贝文件或目录到镜像中,用法同ADD,只是不支持自动下载和解压,例如:

COPY ./start.sh /start.sh

ENV

设置环境内环境变量,例如:

ENV MYSQL_ROOT_PASSWORD 123456
ENV JAVA_HOME /usr/local/jdk1.8.0_45

VOLUME

指定容器挂载点到宿主机自动生成的目录或其他容器,例如:

VOLUME [“/var/lib/mysql”]
PS:一般不会在Dockerfile中用到,更常见的还是在docker run的时候指定-v数据卷。

WORKDIR

为RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录,例如:

WORKDIR /data

使用脚本创建镜像

  • 准备编写DockerFile文件
    vim Dockerfile
1
2
3
4
5
6
7
8
9
10
FROM centos:latest
MAINTAINER zRuiCheng <chengrui.sk@gmail.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
  • 构建镜像
1
docker build -f DockerFile文件路径 -t mycentos:1.1 .
  • 运行镜像创建容器
1
docker run -id -p 9000:8000 mycentos:1.1(name可默认,端口映射方便外部访问)

Docker Compose服务编排

image-20230507191809069

docker-compose安装

docker-compose是docker的独立产品,因此需要安装docker之后再单独安装docker compose

1
2
3
4
5
6
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#下载docker-compose文件
mv docker-compose /usr/local/bin
#将文件复制到/usr/local/bin环境变量下面
chmod +x /usr/local/bin/docker-compose
#给他一个执行权限

docker-compose卸载

在 Docker 中,当我们执行 docker pull xxx 的时候 ,它实际上是从 registry.hub.docker.com这个地址去查找,这就是Docker公司为我们提供的公共仓库。
在工作中,不可能把企业项目push到公有仓库进行管理。为了更好的管理镜像,Docker不仅提供了一个中央仓库,同时允许搭建本地私有仓库。介绍registry、harbor两种私有仓库搭建。

1
rm /usr/local/bin/docker-compose

Docker私有仓库

搭建私有仓库

  • Docker 官方提供了一个搭建私有仓库的镜像 registry ,只需把镜像下载下来,运行容器并暴
    露5000端口,就可以使用了。

docker pull registry:2

docker run -id -v /opt/registry:/var/lib/registry -p 5000:5000 –name=myregistry registry:2

Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,将主机的/opt/registry目录挂载
到该目录,即可实现将镜像保存到主机的/opt/registry目录了。

  • 浏览器访问http://私有服务器ip:5000/v2/__catalog,出现json说明registry运行正常

将本地镜像上传至私有仓库

  • 要通过docker tag将该镜像标志为要推送到私有仓库:

docker tag nginx:latest 私有服务器ip:5000/nginx:latest

  • 通过 docker push 命令将 nginx 镜像 push到私有仓库中:

docker push 私有服务器ip:5000/nginx:latest

  • 访问 http://:私有服务器ip:5000/v2/_catalog 查看私有仓库目录,可以看到刚上传的镜像了:

http://:私有服务器ip:5000/v2/_catalog

从私有仓库拉取镜像

  • 下载私有仓库的镜像,使用如下命令:

docker pull 私有服务器ip:5000/镜像名:版本号
docker pull 私有服务器ip:5000/nginx:latest

Docker与虚拟机对比

image-20230507202214980


相关项目实践即docker与宝塔/青龙的综合运用待后续补充


打赏支持
“我这么辛苦,请赏我点钱钱 o(*^ω^*)o”

docker
https://zcsry.cn/2023/05/07/Docker/
作者
CR
发布于
2023年5月7日
更新于
2023年11月18日
许可协议