Docker入门

364 阅读8分钟

1部署软件问题

  • 如果想让一个软件运行起来要保证操作系统的设置,各种库和组件的安装都是正确的
  • 热带鱼&冷水鱼 冷水鱼适应的水温在5-30度,而热带鱼只能适应22-30度的水温,低于22度扮戏小时就冻死了

2虚拟机

  • 虚拟机就是带环境安装的一种解决方案,他可以在一种操作系统里面运行另一种操作做系统
  • 虚拟机的特点:资源占用多,冗余步揍多,启动速度慢

3 Linux 容器

  • 由于虚拟机存在的这些缺点,linux发展出另一个虚拟化技术,linux容器,linux容器不是一个模拟一个完整的操作系统,而是堆积成进行隔离,或者说,在正常进程的外面套了一个保护层,对于容器里面的进程来说,它接触的各种资源都是虚拟的,从而实现与底层系统的隔离,它的特点是启动快,占用系统资源少,体积小是一个最小化的运行环境

4 Docker是什么

  • Docker是属于linux容器的一种封装,提供简单易用的容器使用接口,他目前是最流行的linux容器解决方案
  • Docker将应用程序与改程序的依赖,打包在一个文件里面,运行这个文件,就会生成一个虚拟容器,程序在这个虚拟容器里面运行,就好像在真事的物理机上运行一样

5 Docker的安装

centos里面安装docker yum -y install docker-io 安装完成之后可以使用docker -v查看docker的版本号 docker info 可以查看docker的信息

6启动docker

systemctl start docker 然后我们就可以再次输入docker info查看docker的相关信息

docker pull 拉去一个镜像回去registry里面拉去一个镜像然后使用docker run运行这个镜像没一个镜像都是一个containers

7使用阿里云镜像加速服务

我们需要在https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors这个平台上注册并登陆我们的阿里云账户

点击上图所示的镜像加速器选择我们对应的linuxt系统,我们的系统是centerOs第一行命令是创建了一个/etc/docker的目录然后我们替换了这个目录下的配置文件,接下来重新加载我们的配置文件daemon-reload 然后重启我们的docker服务

8 image

  • Docker把应用程序及其依赖,打包在image文件里面。只有通过这个文件,才能生成Docker容器
  • image文件我们可以看做是一个容器的模板
  • Docker根据image文件生成容器的实例
  • 同一个image文件,可以生成多个同事运行的容器实例
  • 一个image文件旺旺通过继承另一个image文件,加上一些个性化的配置而生成的

docker search nginx我们可以通过这个查找nginx的镜像

docker image ls我们可以通过这个命令查看我们当前有哪儿些镜像
docker pull nginx通过这个命令拉取nginx镜像,docker image pull和docker pull是一个意思,镜像的名称中li'ba'r

拉取之后通过查看命令可以看到我们多了一个nginx的镜像 docker rmi docker.io/nginx 通过这个命令可以删除对应名字的镜像,也可以通过镜像ID进行删除

9 容器

  • docker run 命令会从image文件,生成一个正在运行的容器实例,这个命令同时应具有抓取image文件的功能。如果发现本地没有指定的image文件就会从仓库进行自动抓取
  • docker run hello-world 输出提示之后hellow world就会停止运行,容器自动终止
  • 有些容器不会自动终止
  • image文件生成的容器实例,本身也是一个文件称之为容器文件,容器生成就会同事存在两个文件:image文件和容器文件
  • 关闭容器并不会删除容器文件,只是容器停止了运行
  • docker rm命令可以停止这个运行中的容器
  • docker kill 终止容器运行
  • docker start 开始容器
  • docker restart 重启容器
  • docker ps -a -l 查看所有容器包括已经停止的 -l可以查看最新的
  • docker stop 终止容器运行和kill的关系就相当于强制关机和关机的区别
  • docker logs查看docker容器的输出
  • docker exec进入一个正在运行的docker容器例:docker exec -it [容器ID] bash
  • 我们可以是用docker ps -a的命令查看所有运行的容器(包括已经退出的实例其实并没有销毁,需要使用上面那个rm的命令进行销毁)
  • docker run --interactive --tty node 这个命令中 -- interative这个参数的是可以交互可以发一些指令给这个容器执行 -tty是启动一个终端
  • docker run -d node可以让这个进程后台运行
  • docker run -d -p 8000:80 nginx这个意思就是我们启动了一个nginx然后把本机的8000端口映射到docker的80端口上
  • docker cp可以把主机上的文件拷贝到容器上反向也可以
  • docker commit -m "xxxx" -a(指定作者) [容器ID]:新的镜像名称

    (注这里我在centOS运行这个命令的时候出现了container_linux.go:235: starting container process caused "process_linux.go:258: applying cgroup configuration for process caused \"Cannot set property TasksAccounting, or unknown property.\""上面的这个报错根据网上的说法是centOS系统版本兼容性的问题我们使用yum update命令升级一下就可以解决了)

10 Dockerfile配置文件

  • Docker的镜像是一层层文件组成
  • 通过docker inspect可以查看这一层层的文件,layers就是镜像的层文件是一个只读的文件不能修改 首先我们创建一个工作目录mywork,然后进入这个目录我们书写一个最简单的server.js放在mywork的app目录下(server.js)

然后在文件目录下创建 Dockerfile

touch Dockerfile
vi Dockerfile
dockerfile
FROM node
WORKDIR /app
COPY ./app /app
RUN npm install
EXPOSE 3000
CMD node server.js

经过上面的创建和编辑这个文件我们可以进行下一步的编译了 docker build -t [作者名]/[镜像名称]:[tag名称如果为latest可以不用写] .(请注意这个点这个代表了当前的路径回去查找当前路径下的Dockerfile文件) 编译完成之后我们可以通过docker image ls可以查看到我们编译出来的镜像

然后我们可以基于这个镜像启动镜像

docker run -d(后台运行) --rm(容器执行之后自动删除镜像文件) -p(指定暴露出来的端口) 3000:3000 [镜像名称]这个命令后面不行写别的命令了否则会替代上面的cmd命令

.dockerignore文件,和github很像我们可以指定不打包到镜像里面的文件

.git
node_modules
  • 这里再次说明一下RUN命令在image文件的构建阶段执行,执行结果都会打包进image文件;CMD命令则是在容器启动之后执行的
  • 一个Dockerfile可以包含多个RUN命令,但是只能有一个CMD命令
  • 指定了CMD命令之后,docker container run命令就不能附加命令比如前面的(/bin/bash进入bansh进行编辑),否则它会覆盖之前的CMD的命令

发布image

注册账户https://hub.docker.com

docker login
docker push [作者名]/[镜像名]
这里我们将上面build打包过后的镜像进行push到镜像仓库中

在push镜像的时候我们发现push的时候我们不会吧整个镜像push上去我们上面说了镜像是由层组成的,我们其实只是push了我们修改的层 对比基础node镜像的docker inspect命令里面展示的layers我们发现多了两个层,这两个层就是我们上传的

修改docker镜像的名字和版本

docker tag [tagID] [作者的名字]/[镜像名称]:[tag]通过这样可以修改一个tag的名称

11 数据盘

  • 删除容器的时候,容器层里创建的文件也会被删除掉,如果有些数据你想永久保存,比如Web服务器的日志,数据库管理系统中的数据,也可以为容器创建一个数据盘
  • 创建容器的时候我们可以通过-v或-volumn给他指定一下数据盘
docker run -v /mnt -it ubuntu bash

通过docker inspect [docker镜像id]我们可以看到里面的source目录其实是本机linux下的一个文件,当我们操作/mnt这个文件就相当于操作了主机这个文件 然后我们发现这个目录是docker比较长我们可以指定目录来作为数据盘 docker run -v ~/logger:/logger -it ubuntu bash冒号左边的是linux的主机路径右边的是挂载到docker容器里面的路径 --volume-from [容器ID] -it unbantu bash我们又启动了一个新的镜像继承了以前启动的镜像的数据盘