Docker入门

一.什么是Docker?

百度百科:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
docker官网:http://www.docker.com

二.为什么说Docker是容器化技术?

image

  • 容器化技术的特点:
  • 标准化:每个容器都是标准化、可移植的,因为他们直接运行在宿主机的内核上
  • 隔离:容器互相隔离,互不干扰,独立运行
  • 高性能:容器性能开销极低,可以实现分钟级甚至秒级的部署和启动
  • 版本:CE(Community Edition:社区版)和 EE(Enterprise Edition:企业版)

三.Docker 理念

Build,Ship and Run Any App,Anywhere,在任何地方构建、 发布并运行任何应用程序(一次封装,到处运行)

四.Docker 架构

image
docker 由三部分组成:

  • Client 客户端
  • docker 主机
  • Registry 镜像仓库服务器

docker daemon:

  • docker 安装后,会以后台运行、守护进程的形式存在
  • images 镜像: 镜像可以用来创建 docker 容器,一个镜像可以创建很多容器
  • containers: 镜像和容器的关系类似面向对象设计中的类和对象, 镜像是容器的模板,容器是基于镜像创建出来的。 容器可以被创建、启动、停止、删除等等。

Registry:

  • 镜像注册服务器 https://hub.docker.com 一个 docker Registry(仓库注册服务器) 中可以包含多个 Repository(仓库); 每个仓库可以包含多个标签/版本(Tag);每个标签对应一个镜像。 仓库分为公开仓库(Public)和私有仓库(Private)两种形式,公开仓库就是 docker 官方仓库,私有仓库是自己搭建的 docker 私服

Client:

  • docker 终端 安装好 docker 中,同时包含了 docker 客户端,客户端负责执行 docker 命令, 发送给 docker 主机中的 docker 守护进程,例如:从仓库下载镜像,通过镜像创 建容器等等

五.CentOS7 安装 docker

1、安装需要的软件包:

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

2、设置 docker 下载镜像(推荐用阿里云,一个字:快)

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3、更新 yum 软件包索引

yum makecache fas

4、安装 DOCKER CE (社区版)

yum install -y docker-ce docker-ce-cli containerd.io

注意第一次安装可能会出现错误,重新执行一下安装的命令就好了

5、启动 docker

systemctl start docker # 启动docker

systemctl enable docker # 设置开机自启动

6、查看版本

docker version

image

7、docker 卸载,一次执行下面的三行命令

systemctl stop docker # 停止docker服务

yum remove -y docker-ce # 删除docker

rm -rf /var/lib/docker # 删除残留文件夹

六.配置阿里云镜像服务加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://ny5dsu6o.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

七.Docker 常用命令

1、Docker 基本命令

(1)版本信息:
docker version

image

(2)详细信息:
docker info

image

(3)帮助文档:
docker --help # 列出所有的docker命令

2、Docker服务相关命令

(1)启动Docker服务:
systemctl start docker

image

(2)关闭Docker服务:
systemctl stop docker

image

(3)查看Docker状态:
systemctl status docker

image

(4)重启Docker服务:
systemctl restart docker

image

(5)设置Docker服务跟随虚拟机开机自启:
systemctl enable docker

image

(6)取消Docker服务跟随虚拟机开机自启:
systemctl disable docker

image

3、Docker 镜像命令(docker官方镜像网站)

(1)查看所有的本机镜像:
docker images [-q |--no-trunc] # -q:查看镜像ID --no-trunc:查看完成的镜像ID

image

(2)查找镜像:
docker search 镜像名称

image

(3)下载镜像:
docker pull 镜像名称:版本号 # 不加版本号默认是latest最新版

image

(4)删除镜像:
docker rmi [-f] 镜像名|镜像ID:版本号 # 删除指定版本镜像,版本为latest版本号可以省略,[-f]:强制删除

image

(5)批量删除:
docker rmi [-f] mysql tomcat redis # 删除多个镜像,使用空格间隔不同的镜像名称

危险操作:我就不演示了

(6)删除全部镜像:
docker rmi -f $(docker images -q)

危险操作:我就不演示了

(7)查看镜像详情:
docker inspect 镜像名|镜像ID

image

(8)查看镜像|容器|数据卷所占空间:
docker system df

image

虚悬镜像:repository和tag都为none

4、容器操作

(1)列出所有正在运行的容器,不包含已停止的容器(容器怎么运行可以看后面):
docker ps

image

(2)列出当前所有已经创建的容器:
docker ps [-aq]

image

(3)创建容器:
docker create 镜像名称 # 根据镜像名创建一个容器

image
image

例如:

docker create --name tomcat1  镜像名称 # 根据镜像创建名为 tomcat1 的容器

image

docker create 镜像 id # 根据镜像 id 新建一个容器

image

(4)启动、停止、重启容器:
  • 启动
docker start 容器名|容器ID

image

  • 停止
docker stop 容器名|容器ID

image

  • 重启
docker restart 容器名|容器ID

image

  • 根据容器名强制停止一个容器
docker kill 容器名|容器ID
(5) 创建并启动容器:
docker run --name tomcat2 tomcat
  • 当本地镜像存在时,相当于 docker create + docker start
  • 当本地镜像不存在时,相当于 docker pull + docker create + docker start

image

(6) 删除容器:
docker rm 容器名称 # 删除未启动的容器

image

docker rm -f 容器名称 # 强制删除已启动的容器

image

docker rm -f $(docker ps -qa) # 删除所有容器,包括正在运行的容器

危险操作:我就不演示了

docker ps -a -q | xargs docker rm # 删除所有容器,不包括正在运行的容器

危险操作:我就不演示了

(7)交互式启动:
docker run -it --name qiu 镜像名|镜像ID

image

(8)进入容器:
docker exec -it 容器ID|容器名称 /bin/bash

image

(9)退出容器:
ctrl + p + q # 不停止退出容器
exit # 容器停止退出,此时执行
(10)启动守护式容器:
docker run -d --name qiu 镜像名|镜像ID

推荐直接使用:

docker run -itd --name qiu 镜像名|镜像ID

5、commit制作本地镜像

(1)提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息"-a="作者"器ID 要创建的目标镜像名:[标签名]

例如:提交我们自己的ubuntu镜像

docker commit -m="my-ubuntu" -a="ly" fa172d2f3952 my-ubuntu:1.1

image

6、commit制作的本地镜像发布到阿里云

为什么要发布到阿里云:好处就是可以与大家共享

$ docker login --username=startqbb registry.cn-qingdao.aliyuncs.com
$ docker tag [ImageId] registry.cn-qingdao.aliyuncs.com/ly0806/study-repository:[镜像版本号]
$ docker push registry.cn-qingdao.aliyuncs.com/ly0806/study-repository:[镜像版本号]

例如:

docker tag 58ba5736d187 registry.cn-qingdao.aliyuncs.com/ly0806/study-repository:1.1
docker push registry.cn-qingdao.aliyuncs.com/ly0806/study-repository:1.1

image

image

7、从阿里云pull镜像到本地

docker pull registry.cn-qingdao.aliyuncs.com/ly0806/study-repository:[镜像版本号]

例如:

docker pull registry.cn-qingdao.aliyuncs.com/ly0806/study-repository:1.1

image

8、使用DockerRegistry搭建个人的Docker私有仓库

(1)下载Docker Registry镜像
docker pull registry
(2)运行私有库Registry,相当于本地有个私有DockerHub
docker run -d -p 5000:5000 -v /ly/myregistry:/tmp/registry --privileged=true registry
(3)commit提交本地镜像
docker commit -m="my-ubuntu-local" -a="ly" fa172d2f3952 my-ubuntu-local:1.2
(4) 先查询一下私服上有什么镜像
curl -XGET http://47.98.194.214:5000/v2/_catalog

image

(5) 将commit提交的镜像修改为私服规范的Tag
docker tag 镜像:Tag Host:Port/Repository:Tag

例如:

docker tag my-ubuntu-local:1.2 47.98.194.214/ly-repository:1.2

image

(6) 修改配置文件
vim /etc/docker/daemon.json
{
......,
"insecure-registries":["47.98.194.214:5000"]
}

重启一下docker

systemctl restart docker
(7) push把镜像推送到本地私服
docker push 47.98.194.214:5000/ly-repository:1.2
(8) 其他人就可以pull下来使用了
docker pull 47.98.194.214:5000/ly-repository:1.2

八.数据卷

1、什么是数据卷:

数据卷是存在于一个或多个容器中的特定文件或文件夹,这个文件或文件夹以独立于 docker 文件 系统的形式存在于宿主机中

2、解决了什么问题?

例如:MySQL 容器损坏无法启动,需要删除容器重新创建,那么数据库数据将会丢失
image

3、安装centos:7镜像:

docker pull centos:7

4、做一个例子

将宿主机根目录中的 qiu 挂载到容器根目录中的 qiu

5、挂载数据卷

docker run -itd --privileged=true -v /qiu:/qiu --name myMysql mysql

参数解释:
–privileged=true:防止出现没有权限

-v:挂载数据卷格式:
/宿主机目录(文件):/容器内目录(文件)
目录必须是绝对路径
如果目录不存在,
则自动创建
可以挂载多个数据卷

image

6、查看数据卷是否挂载成功

docker inspect 容器ID

例如:

docker inspect myMysql

image

7、数据共享

首先进入容器,在容器的数据卷挂载目录中创建文件并写入内容
然后退出容器,查看宿主机挂载目录,可以看到同步更新的文件

8、数据的同步

  • Docker修改,主机同步获得
  • 主机修改,Docker同步获得
  • Docker容器Stop,主机修改,Docker容器重启看数据是否同步

首先停止容器
然后在宿主机修改共享数据 接下来启动前面的容器,
查看共享数据文件,发现数据在容器中同步

9、数据的持久化

首先删除容器
然后在宿主机修改共享数据
接着重新创建容器并挂载数据卷
发现数据在容器中恢复

10、限制容器内部只能读不能写

docker run -it --privileged=true -v /mydocker/u:/temp/u:ro --name u2 ubuntu

参数解释:
/容器目录:ro 镜像名 此时容器只能读取不能写

ro ===> read only

注意:如果挂载了数据目录,主机是可以读写的,并且主机的修改容器也是可以读取到的;反之则不然

11、一个容器挂载多个数据卷,两个容器挂载同一个数据卷

docker run -it -v /dataVolumeHost31:/dataVolumeContainer31 -v /dataVolumeHost32:/dataVolumeContainer32
--name centos3 centos:7
docker run -it -v /dataVolumeHost:/dataVolumeContainer4 --name centos4 centos:7
docker run -it -v /dataVolumeHost:/dataVolumeContainer5 --name centos5 centos:7

12、实现数据卷挂载规则继承,但是容器相互独立,互不影响

docker run -it --privileged=true --volumes-from 父类【父容器】 --name 容器名 镜像:版本

九.常用应用安装

1、安装Tomcat

(1)创建并运行tomcat容器
docker run -d -p 8080:8080 \
-v /docker/tomcat/webapps:/usr/local/tomcat/webapps \
-v /docker/tomcat/logs:/usr/local/tomcat/logs --name ly_tomcat \
tomcat:8.5

image

(2)准备一个index.html页面,使用 ftp 工具上到 /docker/tomcat/webapps/qbb 中

image

(3)浏览器访问一下:http://192.168.137.72:8080/qbb/

image

(4)也可以查看一下tomcat的日志:
docker logs -tf --tail 20 ly_tomcat

image

2、安装MySQL

(1)创建并运行MySQL容器
docker run -p 3306:3306 --name mysql --privileged=true \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7

参数说明:
-e MYSQL_ROOT_PASSWORD:设置root用户的登录密码
image

(2)查看一下mysql的字符集,可以发现字符集不对,我们需要修改
SHOW VARIABLES LIKE 'character%'
(3)修改MySQL字符集
cd /mydata/mysql/conf # 进入宿主机的数据挂载目录
vim my.cnf # MySQL配置文件加入以下内容

[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8

重启MySQL

3、安装Redis

(1)创建并运行Redis容器
# 创建挂载目录
mkdir -p /mydata/redis/conf
touch /mydata/redis/conf/redis.conf

docker run -p 6379:6379 --name redis --privileged=true \
-v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
(2)修改redis.conf
# 可远程连接
# bind 127.0.0.1
# 解除保护模式
protected-mode no
# 数据持久化
appendonly yes
# 设置密码
requirepass root

image

4、Docker安装Nacos

(1) 下载nacos镜像
docker pull nacos/nacos-server
(2) 以单机的方式启动nacos
docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server
(3) 浏览器访问一下,账号:nacos 密码:nacos
http://192.168.159.159:8848/nacos

5、Docker安装Sentinel

(1)下载sentinel镜像
docker pull bladex/sentinel-dashboard
(2) 启动sentinel
docker run --name sentinel -d -p 8858:8858 bladex/sentinel-dashboard
(3) 浏览器访问一下,账号:sentinel 密码:sentinel
http://192.168.159.159:8858

6、Docker安装Nginx

(1)创建多级目录,挂载nginx配置文件
mkdir -p /docker/nginx/conf
(2) 下载镜像,创建容器并启动
docker run -d -p 80:80 \
-v /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /docker/nginx/logs:/var/log/nginx \
-v /docker/nginx/html:/usr/share/nginx/html \
--name=ly_nginx nginx:latest

十.docker 容器化技术和虚拟机技术

image

十一.镜像制作

(1)方式一:通过容器制作镜像

①生成镜像

docker commit 容器名 镜像名称:版本号

②压缩镜像

docker save -o 压缩文件名称 镜像名称:版本号

③还原镜像

docker load -i 压缩文件名称

(2)做一个例子:我们将前面tomcat制作成一个镜像然后部署运行

①将虚拟机的/docker/tomcat/webapps/qbb copy到 qiu_tomcat这个容器下的/usr/local/tomcat/webapps/ROOT目录

docker cp /docker/tomcat/webapps/qbb qiu_tomcat:/usr/local/tomcat/webapps/ROOT

②进入容器:docker exec -it qiu_tomcat /bin/bash,查看index.html是否赋值付过来了

image

③浏览器访问一下:http://192.168.137.72:8080/

image

④生成镜像;注意:要先退出容器(exit)

docker commit -a "qiuqiu<startqbb@163.com>" -m "create image from container" qiu_tomcat qbb/mytomcat:1.0
image

⑤压缩镜像
县创建/opt/docker目录

mkdir -p /opt/docker

执行压缩命令

docker save -o /opt/docker/qbb_mytomcat_v1.0 qbb/mytomcat:1.0

image

⑥还原镜像
我们先删除原来的镜像和容器

docker rm -f qiu_tomcat
docker rmi 9ddc19a406d0
image

由压缩程序还原出镜像文件

docker load -i /opt/docker/qbb_mytomcat_v1.0
image

一键部署

docker run -d -p 8080:8080 --name mytomcat qbb/mytomcat:1.0
image

image

拓展

1.设置docker的开机自启

systemctl enable docker

2.创建容器时设置

docker run -d --restart=always --name 设置容器名 使用的镜像

3.已经创建过的容器,如果创建时未指定 --restart=always,可通过update 命令设置

docker update --restart=always 容器ID(或者容器名)

4.设置了开机自启的容器,如何取消呢?

docker update <容器id,可多个,空格分隔如:111 2222 222> --restart=no 或always

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值