Docker

101 阅读7分钟

Docker

在乌班图中使用

详细方法查看 Docker官方文档

卸载旧版本

如需要,先卸载旧版本

sudo apt-get remove docker docker-engine docker.io containerd runc

获取软件最新源

sudo apt-get update

安装 apt 依赖包

用于通过HTTPS来获取仓库

sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common

安装GPG证书

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

验证

sudo apt-key fingerprint 0EBFCD88

设置稳定版仓库

sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

安装 Docker Engine-Community

更新 apt 包索引

sudo apt-get update

安装最新版本

sudo apt-get install docker-ce docker-ce-cli containerd.io

测试

sudo docker run hello-world

管理docker

显示docker状态

systemctl status docker

启动docker

systemctl start docker

停止docker

systemctl stop docker

重启docker

systemctl restart docker

开机启动

sudo systemctl enable docker

初识Docker

什么是Docker?

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

镜像和容器

Docker中有两个重要的概念:

镜像(Image) :Docker将应用程序及其所需的依赖、函数库、环境、配置等文件 打包在一起,称为镜像。 容器(Container) :镜像中的应用程序运行后形成的进程就是容器,只是Docker 会给容器进程做隔离,对外不可见。

例如你下载了一个QQ,如果我们将QQ在磁盘上的运行文件及其运行的操作系统依 赖打包,形成QQ镜像。然后你可以启动一次,双开、三开QQ,每次开启的QQ都是 一个容

Docker Hub

开源应用程序非常多,打包这些应用往往是重复的劳动。为了避免这些重复劳动, 人们就会将自己打包的应用镜像,例如Redis、MySQL镜像放到网络上,共享使用, 就像GitHub的代码共享一样。

提示:由于Docker镜像仓库的DNS被污染,导致Docker镜像仓库无法访问。使用国 内镜像加速可解决无法访问问题。阿里云官网提供了镜像加速,网址如下:cr.console.aliyun.com/cn-beijing/…

点这里进入:镜像加速

镜像操作

镜像名称

首先来看下镜像的名称组成:

  • 镜像名称一般分两部分组成:[repository]:[tag]。 在没有指定tag时,默认是latest,代表最新版本的镜像 例如:mysql:5.7 这里的mysql就是repository,5.7就是tag,合一起就是镜像名称,代表5.7版本的 MySQL镜像。

镜像命令

常见的镜像操作命令

常用镜像命令:

docker images       #查看镜像
docker rmi          #删除镜像
docker push         #推送镜像到服务器
docker pull         #从DockerHub拉取镜像
docker save         #将镜像保存为压缩包
docker load         #加载压缩包为镜像

拉取、查看镜像

从DockerHub中拉取一个nginx镜像并查看

docker pull [镜像名]:版本        #不写版本时,默认拉取最高(latest)
docker images                   #查看已拉取的镜像

保存、导入镜像

docker save -o 压缩包名.tar 镜像名:版本号         #保存镜像
docker load -i 压缩包名.tar                     #加载本地文件导入镜像

总结

  • 利用docker pull命令拉取镜像
  • 利用docker save命令将镜像保存为tar包
  • 利用docker rmi 删除本地的镜像
  • 利用docker load 重新加载镜像

容器操作

容器相关命令

容器保护三个状态:

  1. 运行:进程正常运行
  2. 暂停:进程暂停,CPU不再运行,并不释放内存
  3. 停止:进程终止,回收进程占用的内存、CPU等资源

其中

  1. docker run:创建并运行一个容器,处于运行状态
  2. docker stop:停止一个运行的容器
  3. docker start:让一个停止的容器再次运行
  4. docker restart:重新启动容器
  5. docker rm:删除一个容器
  6. docker pause:让一个运行的容器暂停
  7. docker unpause:让一个容器从暂停状态恢复运行

创建并运行容器

命令语法:

 docker run --name containerName -p 80:80 -d nginx

语法解析:

  • docker run :创建并运行一个容器
  • --name : 给容器起的名字,例如叫做ng
  • -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
  • -d:后台运行容器 nginx:镜像名称,例如nginx

这里的 -p 参数,是将容器端口映射到宿主机端口。 默认情况下,容器是隔离环境,我们直接访问宿主机的80端口,肯定访问不到容器 中的nginx。 现在,将容器的80与宿主机的80关联起来,当我们访问宿主机的80端口时,就会被 映射到容器的80,这样就能访问到nginx了:

运行nginx容器:

docker run --name ng -p 8081:80 -d nginx:latest

查看运行中的容器:

docker ps

查看所有的容器:

docker ps -a

访问docker容器中的nginx:

打开浏览器,输入docker容器宿主机的ip和nginx的映射端口,例如我的是:http://123.56.17.212:8081/,即可看到结果:

查看docker容器中的nginx访问日志:

docker logs ng

持续查看docker容器中的nginx访问日志:

docker logs ng 1 docker logs -f ng

停止持续显示访问日志:Ctrl + C

数据卷

问题: 镜像中包含了应用程序及其所需的依赖、函数库、环境、配置等,还包括了应 用程序的数据。如果在应用程序运行过程中修改了数据,那么删除镜像后,数 据也同时删除了。 原因: 产生这种问题的原因是容器与数据(容器内文件)耦合带来的后果。 改进: 要解决这个问题,必须将数据与容器解耦,这就要用到数据卷了。

什么是数据卷

数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。

一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。 这样,我们操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内 的/usr/share/nginx/html目录了。

数据卷操作命令

数据卷操作的基本语法如下:

docker volume [COMMAND]

docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操 作:

  • create 创建一个volume
  • inspect 显示一个或多个volume的信息
  • ls 列出所有的
  • volume prune 删除未使用的
  • volume rm 删除一个或多个指定的volume

创建和查看数据卷

创建数据卷:

docker volume create 卷名

查看所有数据卷

docker volume ls

查看数据卷详细信息卷:

docker volume inscept 卷名

挂载数据卷

我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录,命令格 式如下:

docker run --name ng -v html:/usr/share/nginx/html -p 8080:80 -d nginx

这里的-v就是挂载数据卷的命令:

  • -v html:/usr/share/nginx/html :把html数据卷挂载到容器内 的
  • /usr/share/nginx/html这个目录中 nginx默认网页在nginx中的存储位置就是/usr/share/nginx/html目录
  • 挂载后,宿主机的/var/lib/docker/volumes/html/_data目录就是nginx的网页 目录了,在这个目录中创建网页就可用直接访问了。

在/var/lib/docker/volumes/html/_data目录中创建文件index.html。

然后可以访问index.html。

给MySQL挂载本地目录 容器不仅仅可以挂载数据卷,也可以直接挂载到宿主机目录上。

关联关系如下: 带数据卷模式:宿主机目录 ---> 数据卷 ---> 容器内目录 直接挂载模式:宿主机目录 ---> 容器内目录

步骤:

  1. mysql.tar文件上传到服务器
  2. 创建目录/usr/mysql/data
  3. 创建目录/usr/mysql/conf
  4. 将提供的hmy.cnf文件上传到/usr/mysql/conf
  5. 挂载/usr/mysql/data到mysql容器内数据存储目录
  6. 挂载/usr/mysql/conf/hmy.cnf到mysql容器的配置文件
  7. 设置MySQL密码

加载mysql镜像:

docker load -i mysql.tar

运行mysql容器:

docker run \
--name mysql \
-e MYSQL_ROOT_PASSWORD=root \
-p 3309:3306 \
-v /usr/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /usr/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.25

登录Docker内的MySQL

docker exec -it mysql bash

这时已经进入docker的mysql容器。