关于docker:docker基础

34次阅读

共计 6096 个字符,预计需要花费 16 分钟才能阅读完成。

一. 问题提出

软件的运行依赖操作系统的设置,各种库和组件的装置(环境配置问题)。在不同的机器上,可能因为环境不同,软件是否运行,运行后果都会有差异。为了软件的正确运行,必须进行麻烦的环境配置。是否让软件带环境装置呢?

二. 问题的解决

解决办法一: 虚拟机

虚拟机(virtual machine)就是带环境装置的一种解决方案. 能够在一种操作系统中运行另一种操作系统. 如在 windows 中运行 Linux 零碎. 虚拟机对于底层零碎而言就是一个文件.
用户能够通过虚拟机复原软件运行环境, 但也有有余:
1. 资源占用多.
虚拟机占用的内存和硬盘资源在虚拟机运行时, 不管它理论占用多少, 其余机器都不能应用.
2. 冗余步骤多
虚拟机要装置残缺的操作系统,一些零碎级别的操作步骤,往往无奈跳过,比方用户登录。
3. 启动慢
软件必须期待系统启动后, 能力开始运行.

解决办法二:Linux 容器

因为虚拟机存在这些毛病,Linux 倒退出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)
Linux 容器不是模仿一个残缺的操作系统,而是对过程进行隔离
或者说,在失常过程的里面套了一个保护层对于容器外面的过程来说,它接触到的各种资源都是虚构的,从而实现与底层零碎的隔离。

因为容器是过程级别的,相比虚拟机, 根本克服了虚拟机的有余:
容器启动相当于启动一个过程,启动快。只占用必要的资源。只蕴含须要的组件。所以,容器相似轻量级的过程。

三.Docker 是什么?

Docker 属于 Linux 容器的一种封装,提供简略易用的容器应用接口。它是目前最风行的 Linux 容器解决方案。

Docker 工作原理:将应用程序与该程序的依赖,打包在一个文件外面。运行这个文件,就会生成一个虚构容器。程序在这个虚构容器里运行,就如同在实在的物理机上运行一样。
Docker 的接口相当简略,用户能够不便地创立和应用容器,把本人的利用放入容器。容器还能够进行版本治理、复制、分享、批改,就像治理一般的代码一样。

四.Docker 的用处

(1)提供一次性的环境。比方,本地测试别人的软件、继续集成的时候提供单元测试和构建的环境。

(2)提供弹性的云服务。因为 Docker 容器能够随开随关,很适宜动静扩容和缩容。

(3)组建微服务架构。通过多个容器,一台机器能够跑多个服务,因而在本机就能够模拟出微服务架构。

五.Docker 的装置

1. 装置 docker

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun #装置。若提醒无奈连贯到服务器,重试即可。docker version  #检测装置是否胜利。若胜利,则会显示与版本无关的信息。

2.Docker 是服务器 — 客户端架构。命令行运行 docker 命令的时候,须要本机有 Docker 服务
启动 docker 服务如下:

sudo systemctl start docker #启动 docker 服务
sudo systemctl status docker# 查看 docker 服务状态

3. 为防止命令执行加 sudo,执行以下命令将用户退出 docker 用户组

 sudo usermod -aG docker username #username 是用户名!!!!留神:将用户退出 docker 组后,肯定要从新登录,操作才会失效。

六.image 文件

Docker 把应用程序及其依赖,打包在 image 文件外面。只有通过这个文件,能力生成 Docker 容器。image 文件能够看作是容器的模板。Docker 依据 image 文件生成容器的实例。同一个 image 文件,能够生成多个同时运行的容器实例。

image 是二进制文件。理论开发中,一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成。

docker image ls  #列出本机所有的 image 文件
docker image rm [imageName] #删除 imageName 这个 image 文件

image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样能够应用。一般来说,为了节省时间,咱们应该尽量应用他人制作好的 image 文件,而不是本人制作。即便要定制,也应该基于他人的 image 文件进行加工,而不是从零开始制作。

为了不便共享,image 文件制作实现后,能够上传到网上的仓库。Docker 的官网仓库 Docker Hub 是最重要、最罕用的 image 仓库。此外,发售本人制作的 image 文件也是能够的。

七. 运行一个 Docker 示例

 docker image pull library/hello-world# 从远端库中将 image 文件抓取到本地。docker image pull 是抓取命令。library 是 image 文件所在的组,hello-world 是文件名。#docker 官网 image 文件都放在 library 里,且 library 是默认组,故能够省略为:docker image pull  hello-world
#能够查看本机是否有 image 文件:docker image ls
 docker container run hello-world # docker container run 命令会从 image 文件,生成一个正在运行的容器实例,因为本地仓库没有 image 文件时,它能够主动抓取文件,则上一条抓取命令不是必须的。(每执行一次该命令,就新建一个容器)

命令执行胜利后果如下:

输入后果后,hello-world 就会进行。有些容器因为提供服务,所有不会进行。可用以下命令手动进行:

docker container kill [containID] #containID 是容器 ID。查阅办法见下

八. 容器文件

image 文件生成的容器实例,自身也是一个文件,称为容器文件。即一旦容器生成,就会同时存在两个文件:image 文件和容器文件。而且敞开容器并不会删除容器文件,只是容器进行运行而已。

# 列出本机正在运行的容器 
docker container ls #终止容器运行时用到   ==docker ps
#列出本机所有容器,包含终止运行的容器 
docker container ls -a   ==docker ps -a
#终止运行的容器文件,仍然会占据硬盘空间,用以下命令删除
docker container rm [containerID]

九.Dockerfile 文件

Dockerfile 文件是一个文本文件,用来配置 image,Docker 依据该文件生成二进制的 image 文件。

十. 其余命令

docker container start containerID #启动一个已有的,进行运行的容器
docker container stop  containerID #不肯定会立刻终止。docker container kill 会立刻终止。docker container logs containerDI #查看容器输入(容器外面 shell 的规范输入),当 docker  run 没用 -it 命令时,就要用此命令查看。==docker logs containerName
docker container exec  -it [containerID]  /bin/bash #进入正运行的容器,当 docker  run 没用 -it 命令时,就要用此命令进入容器,进入后就能够用容器的 shell 执行命令了。docker container cp [containID]:[/path/to/file] . #在正运行的容器里,拷贝文件到本地机器。此命令拷贝到当前目录。

十一.mysql 容器

一. 启动
启动谬误:1.
docker run --name=test mysql:5.7# 间接启动一个名为 test,版本 5.7 的容器。error: database is uninitialized and password option is not specified
You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD`
起因:没有指定 MYSQL_ROOT_PASSWORD 参数。2.
docker run --name=test --env``="MYSQL_ROOT_PASSWORD=mypassword" mysql:5.7 #增加 MYSQL_ROOT_PASSWORD 这个环境变量

#此时若未删除启动失败的容器。则需删除原来的容器(--name 反复)。否则呈现以下谬误:Error response from daemon: Conflict. The name "test" is already in use by container 80b4914976a2. You have to delete (or rename) that container to be able to reuse that name.
#此时,正确启动后,发现,容器执行在前台(attach mode), 导致命令行无奈输出命令,以及执行命令。#若用 powershell 连贯的,则退出登录,从新登录即可。3. 正确启动
docker run --detach --name=test --env="MYSQL_ROOT_PASSWORD=123456"  mysql:5.7
#长格局时,name,env 前两个 -。少一个出错。#运行在后盾,只有本机利用能够通过 3306 端口能够拜访。二.docker 容器的连贯
正确启动后,能够查看容器信息:docker inspect test #test 是容器命令。从输入中,能够看到 "IPAddress":"172.17.0.20"。能够称为容器 ip
上述形式启动,只有本机利用(如本机上的 mysql 客户端,本机上的容器)能够通过容器 ip 拜访。验证办法如下:sudo apt-get install mysql-client  #装置客户端
 mysql -uroot -pmypassword -h 172.17.0.20 -P 3306 #P 是大写。- u 跟 root 用户,- p 跟启动时设置的明码。- h 是 docker inspect 命令查看到的 ip。容器 ip 是动静的,每次容器重启,都会重新分配一个 ip。那么,两个相连的容器,如何防止因为容器重启,使得连贯生效呢?#若有一个 wordpress 利用想要连贯上曾经存在的 mysql 容器 
 docker run --detach --name test-wordpress --link test-mysql:mysql wordpress# 名叫 test-wordpress 容器连上曾经存在的容器 test-mysql
 docker exec -it test-wordpress bash #进入容器
 cat /etc/hosts #查看此文件。能够看到改容器连贯上了一个 mysql 容器(重启 mysql 容器连贯会放弃,删除 mysql 容器,则进入 test-wordpress 从前会出错)。后果如下:

将 mysql 容器端口映射到本地机器端口,实现从其余机器也能够连贯上此容器
 docker rm -f test #删除容器 test
 docker run --detach --name=test --env="MYSQL_ROOT_PASSWORD=123456" --publish 6603:3306 mysql #--publish 将容器端口 3306 映射到本地机器端口 6603
 #用 docker ps 命令查看后果如下,留神 PROTS 列对应的后果变动。

三.docker 容器的配置文件

1. 启动一个 mysql 5.7 容器,未挂载额定的配置文件时。其内置的配置文件能够在 /etc/mysql 这个目录里找到。此目录下的 my.cnf 蕴含了两个目录:/etc/mysql/conf.d 和 /etc/mysql/mysql.conf.d。若须要增加额定的配置,最好的办法是启动时挂载一个目录,这个目录是容器外的目录(主机目录),而额定的配置文件放在这个目录下即可。格局:--volume= 主机目录:/etc/mysql/conf.d。例如上面的启动形式:$ docker run \
--detach \
--name=test-mysql \
--env="MYSQL_ROOT_PASSWORD=mypassword"\
--publish 6603:3306 \
--volume=/root/docker/test-mysql/conf.d:/etc/mysql/conf.d\
mysql:5.7
#留神:\ 是命令行的换行符,若启动命令在脚本中,则须要删除。--volume 这项就是把主机目录 /root/docker/test-mysql/conf.d(手动创立)下的配置文件挂载到 /etc/mysql/conf.d 目录下。所以启动时,配置文件为:/etc/mysql/my.cnf 和 /etc/mysql/conf.d/my-custom.cnf。#应用 docker exec -it containerID /bin/bash 进入容器,执行相应 mysql 命令能够看到配置是否失效。#很多配置参数都能够在启动时指定。所以能够较少的配置批改能够间接在执行 docker run 命令启动容器时指明。如上面指定最大连接数等设置的的启动形式:$ docker run \
--detach \
--name=test-mysql \
--env="MYSQL_ROOT_PASSWORD=mypassword"\
--publish 6603:3306 \
--volume=/root/docker/test-mysql/conf.d:/etc/mysql/conf.d\
mysql:5.7\
--max-connections=200\
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci \
2. 数据存储
应用 docker inspect containerID |grep -A 4 'Volumes' 命令能够看到数据存储的地位。默认的(启动没挂载数据卷),mysql 容器外面的数据存储目录:/var/lib/mysql(前述命令能够查看)。这很简略直观。但宿主机器(容器所在的机器)拜访这个地位的数据很不不便。因而,较好的办法是在容器外挂载一个目录(可手动创立:留神目录权限问题)。作为数据存储的地位。使得 /var/lib/mysql 映射到挂载的目录。启动形式如下:$ docker run 
--detach 
--name=test-mysql 
--env="MYSQL_ROOT_PASSWORD=mypassword"
--publish 6603:3306
--volume=/root/docker/test-mysql/conf.d:/etc/mysql/conf.d 
--volume=/storage/docker/mysql-datadir:/var/lib/mysql
mysql
这种形式重启和删除容器,并不会删除数据卷。多个 mysql 容器应用同一个数据卷时,同一时刻只能有一个对象拜访数据库的数据。

参考文章
四. 自定义 dockerfile

正文完
 0