Docker

官网:https://www.docker.com/

docker:翻译过来就是容器。“一次封装,到处运行”,docker解决了应用环境的问题,安装了docker的平台就能跑“docker包”。

  • dockerfile:自动化脚本,用来创建下面讲到的镜像
  • image:镜像,可以理解成一个虚拟机的快照,里面包含了你要部署的应用程序以及关联的所有库,
  • container:(容器),通过镜像我们可以创建许多不同的container容器,每个容器是独立运行的,相互之间不影响。(通俗的说,镜像运行起来就是容器)
  • repository:仓库,存放镜像的地方,分为共有仓库和私有仓库。

image-20220330184710019

官方文档:https://docs.docker.com/get-started/overview/

安装Docker

# 需要的安装包
yum install -y yum-utils

# 设置镜像的仓库
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo  # 默认是国外的,速度慢
    
# 推荐使用阿里云的
yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
# 更新软件包的索引
yum makecache fast

# 安装docker相关
yum install -y docker-ce docker-ce-cli containerd.io

# 启动docker
systemctl start docker

# 查看是否安装成功
docker version

# hello world
docker run hello-world

# 查看docker下载的镜像
docker images

卸载docker:

# 1、卸载 Docker 引擎、CLI 和 Containerd 软件包:
yum remove docker-ce docker-ce-cli containerd.io

# 2、映像、容器、卷或自定义配置文件不会自动删除。要删除所有映像、容器和卷:
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

阿里云镜像加速:

在这里插入图片描述


把指令copy过来直接执行就ok了…

Docker常用命令

官方帮助文档地址:https://docs.docker.com/reference/

docker version  # docker 版本信息
docker info    # 显示docker的系统信息,包括镜像和容器


镜像命令

docker images 查看镜像

[root@192 /]# docker images
# 镜像的仓库源  镜像标签       镜像id      镜像创建时间      镜像大小
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   5 months ago   13.3kB

#可选项
--quiet,-q		仅显示镜像 ID

docker search 搜索镜像

dockerHub(直接在web端搜索):https://hub.docker.com/

[root@192 /]# docker search mysql
NAME                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                            MySQL is a widely used, open-source relation…   12241     [OK]       
mariadb                          MariaDB Server is a high performing open sou…   4702      [OK]       
#....省略其他搜索结果

docker pull 下载镜像

[root@192 /]# docker pull mysql   # docker pull 镜像名[:tag]
Using default tag: latest         # 如果没有写tag,默认就是latest(最新)版本
latest: Pulling from library/mysql
72a69066d2fe: Pull complete       # 分层下载
93619dbc5b36: Pull complete 
99da31dd6142: Pull complete 
626033c43d70: Pull complete 
37d5d7efb64e: Pull complete 
ac563158d721: Pull complete 
d2ba16033dad: Pull complete 
688ba7d5c01a: Pull complete 
00e060b6d11d: Pull complete 
1c04857f594f: Pull complete 
4d7cfa90e6ea: Pull complete 
e0431212d27d: Pull complete 
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709  # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest    # 真实地址,等价于docker pull mysql

# 指定版本下载
docker pull mysql:5.7

docker rmi 删除镜像(rmi:remove image)

# 将指定镜像id的镜像删除(删除多个,镜像id使用空格分隔)
[root@192 /]# docker rmi -f 3218b38490ce

#删除所有的镜像(将查询出来的所有镜像的id作为删除镜像操作的参数)
[root@192 /]# docker rmi -f $(docker images -q)

容器命令

docker run 新建容器并重启

docker run [可选参数] image

# 参数说明
--name="Name"    容器名称
-d               后台方式运行
-it              使用交互方式运行,进入容器查看内容
-p               指定容器的端口 -p 主机端口:容器端口
-P               随机指定端口

**docker ps **查看所有运行的容器

[root@192 /]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@192 /]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                          PORTS     NAMES
aba8c900e216   centos         "/bin/bash"   2 minutes ago   Exited (0) About a minute ago             serene_booth
4aa79acb5775   feb5d9fea6a5   "/hello"      2 hours ago     Exited (0) 2 hours ago                    exciting_greider
fac0186fcf99   feb5d9fea6a5   "/hello"      7 hours ago     Exited (0) 7 hours ago                    jolly_edison

参数:
-a    # 列出当前正在运行的容器+历史运行过的容器
-n=?  # 最近运行的容器,只列出n个,例如  -n=1
-q    # 只显示容器的编号

退出容器

exit               # 容器停止并退出
ctrl键 + Q键 + P键  #容器不停止退出

docker rm 删除容器

# 删除指定容器id的容器
docker rm 容器id
# 删除全部的容器也是一样的道理,-f可以删除正在运行的容器
docker rm -f $(docker ps -aq)
# 查询出所有的容器的id作为参数,进行docker容器的删除
docker ps -a -q|xargs docker rm

启动和停止容器的操作

docker start 容器id     # 启动容器
docker restart 容器id   # 重启容器
docker stop 容器id      # 停止当前正在运行的容器
docker kill 容器id      # 强制停止当前容器

查看日志:

docker logs -f -t -n 10 容器id或者容器名称

参数:
--follow,-f		    关注日志输出
--timestamps,-t		显示时间戳
--tail,-n	 	    从日志末尾显示的行数

进入容器:

docker exec    # 进入容器后开启一个新的终端,可以进行操作(常用)
[root@192 admin]# docker exec -it b27468ee7f62 bin/bash
[root@b27468ee7f62 /]# exit    # 或者 ctrl+p+q 不停止容器退出


docker attach 容器id  # 进入容器正在执行的终端

查看容器的详细信息:

docker inspect 容器id

复制容器文件到主机中:

docker cp 容器id:容器文件地址 主机
[root@192 admin]# cd /home/
[root@192 home]# ll
total 4
drwx------. 16 admin admin 4096 Mar 12 20:52 admin    # 原本home中只有这一个文件夹
[root@192 home]# docker exec -it b27468ee7f62 bin/bash  # 进入容器
[root@b27468ee7f62 /]# ls
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@b27468ee7f62 /]# cd home/
[root@b27468ee7f62 home]# ls
[root@b27468ee7f62 home]# touch test.java       # 创建一个文件
[root@b27468ee7f62 home]# ls
test.java
[root@b27468ee7f62 home]# exit 
exit
[root@192 home]# docker cp b27468ee7f62:/home/test.java /home  # 复制操作
[root@192 home]# ls
admin  test.java

容器数据卷

如果我们都在容器中,容器一删除,我们的数据就被删除了,所以我们需要将数据持久化
容器之间可以有一个数据共享的技术,就是我们的容器数据卷。
容器中产生的数据同步到本地,这就是卷技术,目录的挂载,将我们的容器内的目录,挂载到Linux上面。

# 命令
# -v linux目录:容器内目录
[root@192 admin]# docker run -it -p 3366:8080 -v /home/ceshi:/webapps --name="tomcat02" tomcat_my:1.0 /bin/bash

容器删除后,linux挂载的卷数据还在。

挂载的时候如果没有指明卷的绝对地址,或者直接没有指定卷的地址(:的左边),卷都会在 /var/lib/docker/volumes/xxxx/_data,直接没有指定卷的地址这种方式也被称为匿名挂载
没有指明卷的绝对地址(:左边的值不是以/开头),,这种方式称为具名挂载

而我们演示的例子中指定了卷的绝对地址,这种方式称为指定路径挂载,方便查看卷,平时这种方式使用更多

拓展:

# 通过 -v 容器内路径:ro rw 改变读写权限
ro  readonly   # 只读,说明这个路径只能通过宿主机来操作,容器内无法操作
rw  read write # 可读可写

docker run -d -P --name nginx02 -v jvming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v jvming-nginx:/etc/nginx:rw nginx

数据卷容器

让两个容器实现数据同步

例子:多个mysql实现数据共享

# 命令 --volumes-from

# 运行第一个容器
[root@192 ceshi]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name="mysql01" mysql:5.7

# 运行第二个容器
[root@192 ceshi]# docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --name="mysql02" --volumes-from mysql01 mysql:5.7

# 这个时候,可以实现两个容器数据同步,生命周期一直到没有容器使用为之

案例

安装Tomcat

# 官方推荐方式,测试使用,停止后就会直接删除
docker run -it --rm tomcat:9.0

# 直接下载并启动tomcat
docker run -it tomcat:9.0

# 1、启动镜像,并开启指定端口映射
[root@192 admin]# docker run -d --name tomcat01 -p 3355:8080 tomcat:9.0
# 顺带挂载数据卷
# 莫名 -it 来启动有问题
# 然后 -d 启动的话就不可以用 docker attach 来进入容器了,而要使用 docker exec -it 容器id bash 来进入容器
[root@192 ~]# docker run -d --name love -v /home/love:/usr/local/tomcat/webapps/love -p 520:8080 tomcat:9.0

# 2、外部访问测试(发现404报错,进入tomcat中的webapps目录下,发现里面并没有任何内容)
# http://192.168.245.129:3355/
# 而webapps.dist中有我们平时使用的内容,拷贝webapps.dist的所有内容的webapps中
cp -r webapps.dist/* webapps

# 3、访问测试

附:使用ifconfig命令,查看主机ip(ens33中)

安装MySQL

# 获取镜像
[root@192 home]# docker pull mysql:5.7

# 运行镜像的时候做数据挂载,指定端口映射
[root@192 ceshi]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name="mysql01" mysql:5.7

# 使用navicat连接测试...

使用navicat连接成功后,我们尝试创建一个数据库test
在这里插入图片描述

在挂载在linux的home/mysql/data目录中就可以看到我们刚刚创建的数据库了
在这里插入图片描述

commit镜像

对一个镜像进行修改的时候,系统在镜像之上又起了一层“容器层”

如果想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像。

docker commit 提交容器成为一个新的镜像

# 命令
docker commit -m="提交描述信息" -a="作者" 容器id 目标镜像名:[TAG]

# 示例 提交之后我们就可以看到我们提价之后形成的镜像了
[root@192 admin]# docker commit -m="my tomcat" -a="tianyi" 7055953d1f8e tomcat_my:1.0
sha256:c744a31c1515bcbfa6e8f4d5d99b0692c450bd5df05da4c6038b56b015608316
[root@192 admin]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
tomcat_my    1.0       c744a31c1515   6 seconds ago   685MB
tomcat       9.0       b8e65a4d736d   2 months ago    680MB
centos       latest    5d0da3dc9764   6 months ago    231MB
[root@192 admin]# 

shell脚本方式安装

编写脚本,直接运行脚本,一键式安装

1、docker安装脚本

docker_install.sh

#!/bin/bash

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

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

yum makecache fast

yum -y install docker-ce

#安装docker-compose
#curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

#启动docker服务
systemctl start docker

docker run hello-world

编写好脚本之后,直接运行脚本,例如:

#执行shell脚本的三种方式
. docker_install.sh
./xxx.sh
bash xxx.sh
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐