Docker学习笔记
1、简介
1.1 什么是Docker
- Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache2.0 协议开源;
- Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化;
- 容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低;
- Docker 从 17.03 版本之后分为 CE(Community Edition-社区版)和 EE(Enterprise Edition-企业版)。
1.2 Docker的应用场景
- Web应用的自动化打包和发布,自动化测试和持续集成、发布;
- 在服务型环境中部署和调整数据库或其他的后台应用;
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
1.3 友情链接
1.4 Docker的三个概念
- 镜像(Image):类似于虚拟机中的镜像,是一个包含有文件系统的面向Docker引擎的只读模板。任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境的。例如一个Ubuntu镜像就是一个包含Ubuntu操作系统环境的模板,同理在该镜像上装上Apache软件,就可以称为Apache镜像。
- 容器(Container):类似于一个轻量级的沙盒,可以将其看作一个**极简的Linux系统环境(**包括root权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序。Docker引擎利用容器来运行、隔离各个应用。容器是镜像创建的应用实例,可以创建、启动、停止、删除容器,各个容器之间是是相互隔离的,互不影响。注意:镜像本身是只读的,容器从镜像启动时,Docker在镜像的上层创建一个可写层,镜像本身不变。
- 仓库(Repository):类似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方。注意与注册服务器(Registry)的区别:注册服务器是存放仓库的地方,一般会有多个仓库;而仓库是存放镜像的地方,一般每个仓库存放一类镜像,每个镜像利用tag进行区分,比如Ubuntu仓库存放有多个版本(12.04、14.04等)的Ubuntu镜像。
2、CentOS Docker 安装
官方的安装文档:Install Docker Engine | Docker Documentation
2.1 卸载旧版本
不管有没有旧版本,都运行一下:
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.2 安装方法
2.2.1使用仓库安装
- 安装yum-utils,然后设置一个稳定的仓库。
这里官网的仓库是外网的,所以我们设置案例的镜像仓库。
sudo yum install -y yum-utils
#官网的
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#阿里的镜像仓库
yum-config-manager \
—add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装Docker Engine
#先更新docker索引,非必须
yum makecache fast
#安装Docker Engine,过程中需要输入几次y来确认。
sudo yum install docker-ce docker-ce-cli containerd.io
docker-ce表示社区版本,docker-ee企业版,一般用第一个。
- 启动docker
sudo systemctl start docker
- 验证docker是否安装成功
输入docker version查看是否安装成功
[root@muyi muyi]# docker version
Client: Docker Engine - Community
Version: 20.10.8
API version: 1.41
Go version: go1.16.6
Git commit: 3967b7d
Built: Fri Jul 30 19:55:49 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.8
API version: 1.41 (minimum version 1.12)
Go version: go1.16.6
Git commit: 75249d8
Built: Fri Jul 30 19:54:13 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.9
GitCommit: e25210fe30a0a703442421b0f60afac609f950a3
runc:
Version: 1.0.1
GitCommit: v1.0.1-0-g4144b63
docker-init:
Version: 0.19.0
GitCommit: de40ad0
- 运行hello-world镜像来验证docker安装成功
这里会先去远程仓库pull hello-world这个镜像,然后再用这个镜像创建一个容器实例。
sudo docker run hello-world
如果运行成功就代表安装成功。
- 查看docker镜像:
docker images
2.2.2 使用包安装
下载符合版本的.rpm文件安装。
1.去该网站https://download.docker.com/linux/centos/找选择我们CentOS版本,然后浏览x86_64/stable/Packages/并下载你想安装的Docker版本的.rpm文件。
2.安装
sudo yum install /path/to/package.rpm
3.启动
sudo systemctl start docker
4.运行hello-world
sudo docker run hello-world
2.3 使用官方安装脚本自动安装
安装命令如下:
curl -fsSL https://get.docker.com | bash -s docker --mirror aliyun
也可以使用国内 daocloud 一键安装命令:
curl -sSL https://get.daocloud.io/docker | sh
2.3 卸载 docker
- 删除安装包:
yum remove docker-ce
- 删除镜像、容器、配置文件等内容:
rm -rf /var/lib/docker
/var/lib/docker就是docker的默认工作路径
2.4 Docker 镜像加速
国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:
- 科大镜像:https://docker.mirrors.ustc.edu.cn/
- 网易:https://hub-mirror.c.163.com/
- 阿里云:https://<你的ID>.mirror.aliyuncs.com
- 七牛云加速器:https://reg-mirror.qiniu.com
当配置某一个加速器地址之后,若发现拉取不到镜像,请切换到另一个加速器地址。国内各大云服务商均提供了 Docker 镜像加速服务,建议根据运行 Docker 的云平台选择对应的镜像加速服务。
阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,登陆后,左侧菜单选中镜像加速器就可以看到你的专属地址了.
方式二
也可以自己在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件):
{"registry-mirrors":["https://reg-mirror.qiniu.com/"]}
检查加速器是否生效
检查加速器是否生效配置加速器之后,如果拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,在命令行执行 docker info,如果从结果中看到了如下内容,说明配置成功。
$ docker info
Registry Mirrors:
https://reg-mirror.qiniu.com #镜像地址
例如我的能看到是阿里的
3、Docker命令
Reference documentation | Docker Documentation
帮助信息:
#查看版本
docker version
#查看docker系统信息
docker info
#帮助命令
docker --help
eg: docker images --help能查看dockers images的详细使用方式
note:下面的所有命令中,对容器的指定时,容器id很长,可以只写前几个就能被识别,比如前三个就能识别。
镜像命令:
列出镜像:
Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
Options:
-a, --all 显示所有镜像
-f, --filter filter 使用过滤器过滤镜像
dangling true or false, true列出没有标签的,false相反
label (label=<key> or label=<key>=<value>),如果镜像设置有label,则可以通过label过 滤
before (<image-name>[:<tag>], <image id> or <image@digest>) - 某个镜像前的镜像
since (<image-name>[:<tag>], <image id> or <image@digest>) - 某个镜像后的镜像
reference (pattern of an image reference) - 模糊查询,例:--
filter=reference='busy*:*libc'
--format string 格式化输出
.ID 镜像ID
.Repository 镜像仓库
.Tag 镜像tag
.Digest Image digest
.CreatedSince 创建了多久
.CreatedAt 镜像创建时间
.Size 镜像大小
-q, --quiet 只显示镜像ID
搜索镜像:
docker search [镜像名称]
#搜索收藏大于等于600
[root@docker01 ~]# docker search mysql -f stars=600
#搜索官方镜像
[root@docker01 ~]# docker search -f is-official=true mysql
下载镜像:
从镜像仓库中拉取或者更新指定镜像,在未声明镜像标签时,默认标签为latest。
Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Options:
TAG即版本
-a 拉取某个镜像的所有版本
--disable-content-trust 跳过校验,默认开启
#下载只指定版本的mysql,不指定版本下载最新的
[root@muyi muyi]# docker pull mysql:5.7
5.7: Pulling from library/mysql
33847f680f63: Pull complete # 分层下载的过程,每层不一定按顺序完成,可能下面的层比上面的先下载完。
5cb67864e624: Pull complete
1a2b594783f5: Pull complete
b30e406dd925: Pull complete
48901e306e4c: Pull complete
603d2b7147fd: Pull complete
802aa684c1c4: Pull complete
5b5a19178915: Pull complete
f9ce7411c6e4: Pull complete
f51f6977d9b2: Pull complete
aeb6b16ce012: Pull complete
Digest: sha256:be70d18aedc37927293e7947c8de41ae6490ecd4c79df1db40d1b5b5af7d9596#镜像ID号,全球唯一
Status: Downloaded newer image for mysql:5.7 #下载状态
docker.io/library/mysql:5.7#镜像的全路径(镜像的tag)
删除镜像:
注意:删除镜像前必须先删除以此镜像为基础的容器。
Usage: docker rmi [OPTIONS] IMAGE [IMAGE...]
Options:
-f, --force 强制删除
eg:
删除一个:
docker rmi -f imageID
删除多个:
docker rmi -f imageID1 imageId2
删除所有:
docker rmi -f $(docker images -aq)
容器命令
容器是以镜像为模板创建的,所以要先有镜像才可以创建容器,这里先下载一个centos镜像来测试学习。
列出容器
Usage: docker ps [OPTIONS]
Options:
-a, --all 列出所有容器
-f, --filter filter 使用过滤器过滤
--format string 格式化输出
-n, --last int 显示最后创建的n个容器
-l, --latest 显示最后一个创建的容器
-q, --quiet 只显示容器ID
-s, --size 显示大小
创建并启动一个容器
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Options:
-d, --detach 后台以守护进程方式运行容器,并输出容器ID
-e, --env list 设置环境变量,该变量可以在容器内使用
-h, --hostname string 指定容器的hostname
-i, --interactive 以交互模式运行容器,通常与-t同时使用
-l, --label list 给容器添加标签
--name string 设置容器名称,否则会自动命名
--network string 将容器加入指定网络
-p, --publish list 设置容器映射端口
用法:
-p ip:主机端口:容器端口
-p 主机端口:容器端口 #(常用的方式)
-p 容器端口
容器端口
-P,--publish-all 将容器设置的所有exposed端口进行随机映射
--restart string 容器重启策略,默认为不重启
on-failure[:max-retries]:在容器非正常退出时重启,可以设置重启次数。
unless-stopped:总是重启,除非使用stop停止容器
always:总是重启
--rm 容器退出时则自动删除容器
-t, --tty 分配一个伪终端
-u, --user string 运行用户或者UID
-v, --volume list 数据挂载
-w, --workdir string 容器的工作目录
--privileged 给容器特权
后台启动容器-d有个前提,就是容器中要有一个前台进程在运行,否则docker会将其关闭
eg:
#-p指定端口映射 docker run -d -p 宿主机IP:宿主主机端口:容器内端口 [镜像的名称] [cmd]
docker run -d -p 80:80 nginx
#端口范围映射
docker run -d -p 81-89:81-89 nginx
#-P随机端口映射
docker run -d -P nginx
eg:-it以交互式方式打开一个伪终端
[root@muyi muyi]# docker run -it centos /bin/bash
[root@407c90c3b71b /]#
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
退出容器
exit #停止容器并退出
Ctrl+p+q #容器不停止退出
删除容器
docker rm 容器id #删除容器,如果容器正再运行,需要加-f来强制删除
docker rm -f $(docker ps -aq) #删除所有容器
docker ps -a -q|xargs docker rm #管道方式删除所有容器
启动和停止容器
docker start 容器id,容器id2 #启动一个或多个容器
docker restart 容器id ,容器id2 #重启一个或多个容器
docker stop 容器id ,容器id2 #停止一个或多个容器
docker kill 容器id,容器id2 #强制停止一个或多个容器
其它命令
rename
给容器重命名
Usage: docker rename CONTAINER NEW_NAME
logs
显示容器日志
Usage: docker logs [OPTIONS] CONTAINER
Options:
--details 显示详细日志
-f, --follow 跟随日志输出
--tail string 显示行数
-t, --timestamps 显示时间戳
inspect
获取容器或镜像的元数据
Usage: docker inspect [OPTIONS] NAME|ID [NAME|ID...]
进入容器
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
- docker attach :如果从这个容器退出,会导致容器的停止。
- docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。
exec
向正在运行的容器下发命令
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Options:
-d, --detach 在后台运行命令
-e, --env list 设置环境变量
-i, --interactive 以交互模式运行
-t, --tty 分配一个伪终端
-u, --user string 执行命令的用户
-w, --workdir string 工作目录
eg:进入centos容器,其中的 /bin/bash是进入后的命令
docker exec -it 407c90c3b71b /bin/bash
cp
在容器和宿主机之间拷贝文件
Usage:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
Options:
-a, --archive 保留文件权限
eg:
docker cp 407c90c3b71b:/home/demo.java ./
docker cp ./demo2.java 407c90c3b71b:/home/demo.java
查看内存占用:
docker stats
导出和导入容器
导出容器
如果要导出本地某个容器,可以使用 docker export 命令
docker export 407c90c3b71b > centos.tar
导出容器 407c90c3b71b快照到本地文件 centos.tar,这样将导出容器快照到本地文件。
导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像
可视化
可跳过,一般不用。
安装一个可视化面板portainer
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portaine
然后登录地址{ip}:8088,进入这个界面前会先让你创建用户,这里用户名就用它admin,密码要求不少于8位(这段话是为了提醒我我用的是哪个密码)
但是一般不用。。。
练习
安装nginx
首先dockerhub搜索nginx,然后里面有相应介绍,但是这里先按照自己方式下载镜像并启动容器:
docker run -d --name nginx01 -p 3344:80 nginx
启动成功后我们访问 localhost:3344就能看见nginx 的欢迎界面了
curl localhost:3344
安装tomcat
官方的方式:
docker run -it --rm tomcat:9.0
这里的 --rm是指容器停掉就删除,用完即删,一般是用于测试的。
这样相当于镜像下载了,然后跑了容器试一下
正式创建容器并启动:
docker run -d --name tomcat01 -p 8888:8080 tomcat:9.0
这是后台启动的,现在要进入改容器
docker exec -it tomcat01 /bin/bash
然后进入后当前环境就是tomcat根目录下,但是阿里镜像默认下载的是一个极简版tomcat,所以webapps里面没有项目,但是当前目录下的webapps.dist有那些东西,所以可以将这里面内容复制到webapps下面。
cp -r webapps.dist/* webapps
然后我们访问 主机ip:8888就能看见tomcat主页,那只小黄猫了。
安装elasticsearch
docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” elasticsearch:7.6.2
参考:
https://www.docker.org.cn/book/docker/docker-push-image-13.html
https://www.runoob.com/docker/centos-docker-install.html
https://www.bilibili.com/video/BV1og4y1q7M4?p=39