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 - 安装

在安装之前先检查系统版本是否符合官网文档的要求。

  1. 查看系统内核版本

    $ uname -r
  2. 查看系统配置

    $ cat /etc/os-release
  3. 卸载旧版本

    $ sudo apt-get remove docker docker-engine docker.io containerd runc
  4. 更新apt包索引并安装包以允许apt通过 HTTPS 使用存储库

    $ sudo apt-get update
    $ sudo apt-get install \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
  5. 添加官方的GPG秘钥

    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  6. 设置稳定存储库

    $ 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
  7. 安装 Docker 引擎

    $ sudo apt-get update
    $ sudo apt-get install docker-ce docker-ce-cli containerd.io
  8. 测试

    # 启动 docker
    $ systemctl start docker
    # 查看当前版本号
    $ docker version

    出现版本号则表示安装成功。

Docker - 卸载

  1. 卸载依赖

    $ sudo apt-get remove docker docker-engine docker.io containerd runc
  2. 卸载资源

    $ 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 - 实例

关于端口暴露

  1. Nginx

    $ docker search nginx
    $ docker pull nginx
    $ docker run -d --name nginx01 -p 1234:80 nginx
    
    	-d 后台运行
    	--name 给容器命名
    	-p 1234:80 将宿主机的1234端口映射到该容器的80端口
  2. 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
  3. 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语言中指针的定义理解。

参考

什么是Docker?看这一篇干货文章就够了!

Docker快速入门总结笔记