Docker - 介绍
Docker 是一个用_Go语言_实现的开源项目,可以让我们方便的创建和使用容器,docker将程序以及程序所有的依赖都打包到 docker container,这样你的程序可以在任何环境都会有一致的表现。
这里程序运行的依赖也就是容器就好比集装箱(相互独立),容器所处的操作系统环境就好比货船或港口,程序的表现只和集装箱有关系(容器),和集装箱放在哪个货船或者哪个港口(操作系统)没有关系。
因此我们可以看到 Docker 可以屏蔽环境差异,也就是说,只要你的程序打包到了 Docker 中,那么无论运行在什么环境下程序的行为都是一致的。
Docker从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
Docker 的优势就是快速部署,这是当前互联网公司最常见的一个应用场景,一个原因在于容器启动速度非常快,另一个原因在于只要确保一个容器中的程序正确运行,那么你就能确信无论在生产环境部署多少都能正确运行。
Docker - 组成
镜像(image)
Docker 的镜像好比为一个_模板_,可以通过这个模板来创建容器服务,例如:Tomcat 镜像 ===> run ==> Tomcat1 容器(提供服务器),通过一个镜像可以创建很多容器。
容器(container)
Docker 利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。
可以理解为一个简易的 linux 系统。
仓库(repository)
仓库就是存放镜像的地方。
官方仓库:Docker Hub
Docker - 安装
在安装之前先检查系统版本是否符合官网文档的要求。
查看系统内核版本
$ uname -r
查看系统配置
$ cat /etc/os-release
卸载旧版本
$ sudo apt-get remove docker docker-engine docker.io containerd runc
更新
apt
包索引并安装包以允许apt
通过 HTTPS 使用存储库$ sudo apt-get update $ sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release
添加官方的GPG秘钥
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
设置稳定存储库
$ echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安装 Docker 引擎
$ sudo apt-get update $ sudo apt-get install docker-ce docker-ce-cli containerd.io
测试
# 启动 docker $ systemctl start docker # 查看当前版本号 $ docker version
出现版本号则表示安装成功。
Docker - 卸载
卸载依赖
$ sudo apt-get remove docker docker-engine docker.io containerd runc
卸载资源
$ sudo rm -rf /var/lib/docker
Docker - 容器运行流程
当执行docker run 容器名
命令时的运行流程:
Docker - 命令
操作 Docker 的常用命令,可以参考官方文档
基础命令
$ docker version #查看docker的版本信息
$ docker info #查看docker的系统信息,包括镜像和容器的数量
$ docker 命令 --help #帮助命令(可查看可选的参数)
查看本地主机的所有镜像
$ docker images # 查看本地主机的所有镜像
各字段含义
字段 | 含义 |
---|---|
REPOSITORY | 镜像的仓库源 |
TAG | 镜像的标签 |
IMAGE ID | 镜像的id |
CREATED | 镜像的创建时间 |
SIZE | 镜像的大小 |
可选参数
-a/–all 列出所有镜像
-q/–quiet 只显示镜像的id
搜索镜像
$ docker search 关键字 # 搜索镜像
可选参数
-f, –filter filter Filter output based on conditions provided
–format string Pretty-print search using a Go template
–limit int Max number of search results (default 25)
–no-trunc Don’t truncate output
下载镜像
$ docker pull 镜像名[:tag] # 下载镜像,未标注 tag 时默认为最新版本
$ docker pull mysql:5.7 # 下载 mysql 5.7
提交镜像
下载镜像版本,加入我们需要的内容,提交后就可以直接使用修改后的版本。
$ docker commit -m="提交的信息" -a="作者" 容器id 目标镜像名:[TAG]
删除镜像
$ docker rmi -f 镜像id (镜像id 镜像id # 根据镜像id删除一个或多个镜像
$ docker rmi -f $(docker images -aq) # 删除所有镜像
创建容器
$ docker pull centos # 拉取 centos 镜像
$ docker run [可选参数] 镜像名 # 创建并运行容器
# 参数说明
--name="名字" # 指定容器名字
-d # 后台方式运行
-it # 使用交互方式运行,进入容器查看内容
-p # 指定容器的端口
-p ip:主机端口:容器端口 # 配置主机端口映射到容器端口
-p 主机端口:容器端口
-p 容器端口
-P # 随机指定端口(大写的P)
退出容器
$ exit # 停止并退出当前容器
Ctrl
+ P
+ Q
:退出但不停止当前容器
历史容器
$ docker ps # 列出当前正在运行的容器
-a # 列出所有容器的运行记录
-n=? # 显示最近创建的?个容器
-q # 只显示容器的编号
删除容器
$ docker rm 容器id # 根据容器id删除容器,不能删除正在运行的容器,强制删除加入 -f 参数
$ docker rm -f $(docker ps -aq) # 删除所有的容器
$ docker ps -a -q|xargs docker rm # 删除所有的容器
启动和停止容器
$ docker start 容器id # 启动容器
$ docker restart 容器id # 重启容器
$ docker stop 容器id # 停止当前运行的容器
$ docker kill 容器id # 强制停止当前容器
查看容器日志日志
$ docker logs -tf 容器id # 动态显示容器完整日志
$ docker logs --tail number 容器id # 显示最后number条日志
查看容器进程信息
$ docker top 容器id
查看容器元数据
$ docker inspect 容器id
进入后台运行的容器
$ docker exec -it 容器id 终端 # 进入容器后开启一个新的终端
$ docker attach 容器id # 进入容器正在运行的终端,不会启动新的进程
复制文件
$ docker cp 容器id:容器内路径 目的主机路径 # 拷贝容器的文件到主机中
$ docker cp 目的主机路径 容器id:容器内路径 # 拷贝宿主机的文件到容器中
Docker - 实例
关于端口暴露
Nginx
$ docker search nginx $ docker pull nginx $ docker run -d --name nginx01 -p 1234:80 nginx -d 后台运行 --name 给容器命名 -p 1234:80 将宿主机的1234端口映射到该容器的80端口
Tomcat
$ docker search tomcat $ docker pull tomcat $ docker run -d --name myTomcat -p 2234:8080 tomcat -d 后台运行 --name 给容器命名 -p 2234:80 将宿主机的2234端口映射到该容器的8080端口
404 的原因是
webapps
无项目初始项目在
webapps.dist
下,把整个目录复制到webapps
下$ cp -r webapps.dist/* webapps
MySQL
$ docker search mysql $ docker pull mysql $ docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
成功连接数据库
成功映射数据
映射后,即便容器被删数据依旧存在
Portaniner
Portaniner 是 Docker 的图形化管理工具,类似的工具还有 Rancher
$ docker run -d -p 3234:9000 --name myPort --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
注册账号
选择本地
创建成功
数据卷
作用:把容器内的数据挂载到主机
$ docker run -it -v 主机地址:容器地址 centos /bin/bash # 将容器地址映射到主机
$ docker inspect 容器id # 查看映射情况
映射成功
数据卷内容为双向绑定,不会占用双倍存储,可以参考C语言中指针的定义理解。