Docker


Docker

Docker解决依赖兼容问题

采用了两个手段:

  • 将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包
  • 将每个应用放到一个隔离容器去运行,避免互相干扰
1
1

Docker解决操作系统环境差异

1.应用调用操作系统应用(函数库),实现各种功能

2.函数库是对内核指令集的封装,会调用内核指令

3.内核指令操作计算机硬件

Docker如何解决不同系统环境的问题?

Docker将用户程序与所需要调用的系统(比如Ubuntu)函数库一起打包,不管实际的运行系统是Centos还是Ubuntu都可以正常运行,因为应用程序调用的是捆绑在一起的系统的函数,系统函数再调用linux内核的函数。 Docker运行到不同操作系统时,直接基于打包的函数库,只借助于操作系统的Linux内核来运行,不在乎实际运行的系统版本是什么。

    Docker是一个快速交付应用、运行应用的技术,具备下列优势:

        可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统
        运行时利用沙箱机制形成隔离容器,各个应用互不干扰
        启动、移除都可以通过一行命令完成,方便快捷
    Docker和虚拟机的差异:
        docker是一个系统进程;虚拟机是在操作系统中的操作系统
        docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般
3
3

Docker架构

镜像和容器
镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。

容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。

    镜像就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的文件包。这个文件包是只读的。

    容器就是将这些文件中编写的程序、函数加载到内存中允许,形成进程,只不过要隔离起来。因此一个镜像可以启动多次,形成多个容器进程。


DockerHub

网址:https://hub.docker.com/open in new window

Docker架构

Docker是一个CS架构的程序,由两部分组成:

  • 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
  • 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。
2
2

CentOS安装Docker

Docker 分为 CE 和 EE 两大版本,CE 即社区版,分别为stable、test、nightly,stable是稳定版本,test是测试后的预发布版本,而nightly则是开发中准备在下一个版本正式发布的版本

EE 即企业版,强调安全,付费使用

1.1.卸载(可选)

如果之前安装过旧版本的Docker,可以使用下面命令卸载:

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine \
                  docker-ce

1.2.安装docker

安装yum工具

yum install -y yum-utils \
           device-mapper-persistent-data \
           lvm2 --skip-broken

然后更新本地镜像源:

# 设置docker镜像源
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

yum makecache fast

然后输入命令:

yum install -y docker-ce

1.3.启动docker

关闭防火墙

# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld

通过命令启动docker:

systemctl start docker  # 启动docker服务

systemctl stop docker  # 停止docker服务

systemctl restart docker  # 重启docker服务

然后输入命令,可以查看docker版本:

docker -v

如图:

4
4

1.4.配置镜像加速

docker官方镜像仓库网速较差,我们需要设置国内镜像服务:

参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrorsopen in new window

2.CentOS7安装DockerCompose

2.1.下载

Linux下需要通过命令下载:

# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

2.2.修改文件权限

修改文件权限:

# 修改权限
chmod +x /usr/local/bin/docker-compose

2.3.Base自动补全命令:

# 补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

如果这里出现错误,需要修改自己的hosts文件:

echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts

echo "199.232.68.133 raw.githubusercontent.comopen in new window" >> /etc/hosts

3.Docker镜像仓库

带有图形化界面版本

使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:

version: '3.0'
services:
  registry:
    image: registry
    volumes:
      - ./registry-data:/var/lib/registry
  ui:
    image: joxit/docker-registry-ui:static
    ports:
      - 8080:80
    environment:
      - REGISTRY_TITLE=私有仓库
      - REGISTRY_URL=http://registry:5000
    depends_on:
      - registry

配置Docker信任地址

我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:

# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://192.168.150.101:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker

docker命令

docker基础命令

1.启动docker

systemctl start docker

2.关闭docker

systemctl stop docker 

3.重启docker

systemctl restart docker 

4.设置docker开机启动

systemctl enable docker

5.查看docker的运行状态

systemctl status docker

6.docker的帮助命令

docker --help
假如我们启动镜像的时候忘记命令的使用
docker  run  --help

docker镜像命令

1.查看docker镜像列表

docker  images

2 .单独搜索镜像

docker  images  镜像名

3.拉取镜像

不加tag(版本号) 即拉取docker仓库中 该镜像的最新版本latest 加:tag 则是拉取指定版本
docker pull 镜像名 
docker pull 镜像名:tag 

4.删除没有用的镜像

#删除一个
docker rmi -f 镜像名/镜像ID

#删除多个 其镜像ID或镜像用用空格隔开即可 
docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID

#删除全部镜像  -a 意思为显示全部, -q 意思为只显示ID
docker rmi -f $(docker images -aq)
强制删除
docker image rm 镜像名称/镜像ID

docker容器命令

1.查看正在运行的容器

docker  ps

2.查看所有容器包括正在运行和停掉的容器

docker  ps  -a

3.运行一个容器

# -it 表示 与容器进行交互式启动 -d 表示可后台运行容器 (守护式运行)  --name 给要运行的容器 起的名字  /bin/bash  交互路径
docker run -it -d --name 要取的别名 镜像名:Tag /bin/bash  

4.访问容器

这里的5f39bcf1dbad是容器ID

docker  exec -it 5f39bcf1dbad /bin/bash 

5.删除容器 首先要停止运行的容器

# 先停止咱之前运行的 mysql5.7 容器 
docker stop 容器名/容器ID

然后再进行查询所有容器

docker ps -a 
#删除一个容器
docker rm -f 容器名/容器ID
#删除多个容器 空格隔开要删除的容器名或容器ID
docker rm -f 容器名/容器ID 容器名/容器ID 容器名/容器ID
#删除全部容器
docker rm -f $(docker ps -aq

容器端口与服务器端口映射

-p 宿主机端口:容器端口 

8080:8081解析 将容器内部的 8081端口与docker 宿主机(docker装在哪台服务器 哪台服务器就是宿主机)8888 端口进行映射 那通过外部访问宿主机8080端口 即可访问到 docker 容器 8081端口了

docker run -it  -d --name mysql  -p 8888:6379 mysql:5.7 /bin/bash

然后运行容器

exit  或者 ctrl+p+q 

构建Docker镜像

docker build -t <镜像名称> <Dockerfile所在路径>
docker build -t my-image /path/to/Dockerfile

docke安装Nginx

1.创建目录

#mkdir -p /data/nginx/{conf.d,logs,html,conf}

其中

data/nginx/conf.d用来映射 include /etc/nginx/conf.d/*.conf 文件内容

/data/nginx/logs用来映射 日志

/data/nginx/html 用来映射 网站代码

/data/nginx/conf 用来映射 默认配置文件nginx.conf

2.启动一个测试容器

docker run  --name nginx_ceshi  -p 80:80  --privileged=true -d nginx

3.将测试容器的文件拷贝到目录

删除测试容器

#docker stop nginx_ceshi

#docker rm nginx_ceshi

4.启动容器

docker run  --name nginx  -p 80:80 -v /data/nginx/conf.d:/etc/nginx/conf.d -v /data/nginx/logs:/var/log/nginx -v /data/nginx/html:/usr/share/nginx/html -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf  --privileged=true -d nginx