2018-10-08

布署软件的问题


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

2. 虚拟机 [#](#t12. 虚拟机)

  • 虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统
    • 资源占用多
    • 冗余步骤多
    • 启动速度慢

3. Linux 容器 [#](#t23. Linux 容器)

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

4. Docker 是什么 [#](#t34. Docker 是什么)

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

5. Docker 的安装 [#](#t45. Docker 的安装)

centos7.2中安装docker

yum -y install docker-io

查看docker版本

$ docker version
$ docker info

启动docker服务

systemctl start docker

6. Docker架构 [#](#t56. Docker架构)

docker

7.阿里云加速 #

  • 镜像仓库

  • 管理中心

    mkdir -p /etc/docker
    tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://fwvjnv59.mirror.aliyuncs.com"]
    }
    EOF
    systemctl daemon-reload
    systemctl restart docker
    

8. image [#](#t78. image)

  • Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器
  • image 文件可以看作是容器的模板
  • Docker 根据 image 文件生成容器的实例
  • 同一个 image 文件,可以生成多个同时运行的容器实例
  • 一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成
命令 含义 案例
images 查看全部镜像 docker image ls
pull 拉取镜像 docker rmi [imageName]
rmi 删除镜像 docker rmi [imageName]

8.1 查找镜像 [#](#t88.1 查找镜像)

docker search ubuntu
字段 含义
NAME 名称
DESCRIPTION 描述
STARTS 星星的数量
OFFICIAL 是否官方源

8.2 查看镜像 [#](#t98.2 查看镜像)

docker image ls
字段 含义
REPOSITORY 仓库地址
TAG 标签
IMAGE_ID 镜像ID
CREATED 创建时间
SIZE 镜像大小

8.3 拉取镜像 [#](#t108.3 拉取镜像)

docker  pull hello-world
  • docker image pull是抓取 image 文件的命令
  • library/hello-world是 image 文件在仓库里面的位置,其中library是 image的作者,hello-world是 image 文件的名字
  • Docker 官方提供的 image 文件,都放在library组里面,所以它的是默认组,可以省略 docker image pull hello-world

8.4 删除镜像 [#](#t118.4 删除镜像)

docker rmi  hello-world

9. 容器 [#](#t129. 容器)

  • docker run 命令会从 image 文件,生成一个正在运行的容器实例。
  • docker container run命令具有自动抓取 image 文件的功能。如果发现本地没有指定的 image 文件,就会从仓库自动抓取
  • 输出提示以后,hello world就会停止运行,容器自动终止。
  • 有些容器不会自动终止
  • image 文件生成的容器实例,本身也是一个文件,称为容器文件
  • 容器生成,就会同时存在两个文件: image 文件和容器文件
  • 关闭容器并不会删除容器文件,只是容器停止运行

9.1 命令 [#](#t139.1 命令)

命令 含义 案例
run 从镜像运行一个容器 docker image ls
ps 查看当前运行的容器 docker ps -a -l
kill [containerId] 终止容器(发送SIGKILL ) docker kill [containerId]
rm [containerId] 删除容器 docker rm [containerId]
start [containerId] 启动已经生成、已经停止运行的容器文件 docker start [containerId]
stop [containerId] 终止容器运行 (发送 SIGTERM ) docker stop [containerId]
logs [containerId] 查看 docker 容器的输出 docker logs [containerId]
exec [containerId] 进入一个正在运行的 docker 容器 docker container exec -it [containerID] /bin/bash
cp [containerId] 从正在运行的 Docker 容器里面,将文件拷贝到本机 docker container cp [containID]:app/package.json .

9.2 启动容器 [#](#t149.2 启动容器)

docker run ubuntu /bin/echo "Hello world"
  • docker: Docker 的二进制执行文件。
  • run:与前面的 docker 组合来运行一个容器。
  • ubuntu指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
  • /bin/echo "Hello world": 在启动的容器里执行的命令

Docker以ubuntu镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果

9.3 查看容器 [#](#t159.3 查看容器)

docker ps
docker -a
docker -l
  • -a 显示所有的容器,包括已停止的
  • -a 显示最新的那个容器
字段 含义
CONTAINER ID 容器ID
IMAGE 使用的镜像
COMMAND 使用的命令
CREATED 创建时间
STATUS 状态
PORTS 端口号
NAMES 自动分配的名称

9.4 运行交互式的容器 [#](#t169.4 运行交互式的容器)

docker run -i -t ubuntu /bin/bash
  • -t=--interactive 在新容器内指定一个伪终端或终端。
  • -i=--tty 允许你对容器内的标准输入 (STDIN) 进行交互。

我们可以通过运行exit命令或者使用CTRL+D来退出容器。

9.5 后台运行容器 [#](#t179.5 后台运行容器)

docker run --detach centos ping www.baidu.com
docker logs --follow ad04d9acde94
docker stop ad04d9acde94

9.6 kill [#](#t189.6 kill)

docker kill 5a5c3a760f61

9.7 删除容器 [#](#t199.7 删除容器)

docker rm 5a5c3a760f61

10. 制作个性化镜像 [#](#t2010. 制作个性化镜像)

10.1 编辑镜像 [#](#t2110.1 编辑镜像)

docker commit -m"hello" -a "zhangrenyang" [containerId] zhangrenyang/hello:latest
docker images
docker run zhangrenyang/hello /bin/bash
docker rm b2839066c362
docker rmi c79ef5b3f5fc

11. 制作Dockerfile [#](#t2211. 制作Dockerfile)

  • Docker 的镜像是用一层一层的文件组成的

  • docker inspect命令可以查看镜像或者容器

  • Layers就是镜像的层文件,只读不能修改。基于镜像创建的容器会共享这些文件层

    docker inspect centos
    

11.1 编写Dockerfile [#](#t2311.1 编写Dockerfile)

命令 含义 案例
FROM 继承的镜像 FROM node
COPY 拷贝 COPY ./app /app
WORKDIR 指定工作路径 WORKDIR /app
RUN 编译打包阶段运行命令 RUN npm install
EXPOSE 暴露端口 EXPOSE 3000
CMD 容器运行阶段运行命令 CMD npm run start

11.2 .dockerignore [#](#t2411.2 .dockerignore)

表示要排除,不要打包到image中的文件路径

.git
node_modules

11.3 Dockerfile [#](#t2511.3 Dockerfile)

npm install express-generator -g
express app

Dockerfile

FROM node
COPY ./app /app
WORKDIR /app
RUN npm install
EXPOSE 3000
  • FROM 表示该镜像继承的镜像 :表示标签
  • COPY 是将当前目录下的app目录下面的文件都拷贝到image里的/app目录中
  • WORKDIR 指定工作路径,类似于执行 cd 命令
  • RUN npm install 在/app目录下安装依赖,安装后的依赖也会打包到image目录中
  • EXPOSE 暴露3000端口,允许外部连接这个端口
  • CMD 执行命令

11.4 创建image [#](#t2611.4 创建image)

docker build -t express-demo .
  • -t用来指定image镜像的名称,后面还可以加冒号指定标签,如果不指定默认就是latest
  • . 表示Dockerfile文件的所有路径,.就表示当前路径

11.5 从新的镜像运行容器 [#](#t2711.5 从新的镜像运行容器)

docker container run -p 3333:3000 -it express-demo /bin/bash


npm start
  • -p参数是将容器的3000端口映射为本机的3333端口
  • -it参数是将容器的shell容器映射为当前的shell,在本机容器中执行的命令都会发送到容器当中执行
  • express-demo image的名称
  • /bin/bash 容器启动后执行的第一个命令,这里是启动了bash容器以便执行脚本
  • --rm 在容器终止运行后自动删除容器文件

11.6 CMD [#](#t2811.6 CMD)

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

11.7 发布image [#](#t2911.7 发布image)

  • 注册账户

    docker login
    docker image tag [imageName][username]/[repository]:[tag]
    docker image build -t [username]/[repository]:[tag] .
    
    docker tag express-demo zhangrenyang/express-demo:1.0.0
    docker push zhangrenyang/express-demo:1.0.0
    

12 数据盘 [#](#t3012 数据盘)

  • 删除容器的时候,容器层里创建的文件也会被删除掉,如果有些数据你想永久保存,比如Web服务器的日志,数据库管理系统中的数据,可以为容器创建一个数据盘。

  • 创建容器的时候我们可以通过-v--volumn给它指定一下数据盘

    12.1 默认数据盘 [#](#t3112.1 默认数据盘)

    docker run -v /mnt -i -t --name logs centos bash
    echo 1 > 1.txt
    exit
    
    docker inspect logs
    "Mounts": [
        {
            "Source":"/mnt/sda1/var/lib/docker/volumes/dea6a8b3aefafa907d883895bbf931a502a51959f83d63b7ece8d7814cf5d489/_data",
            "Destination": "/mnt",
        }
    ]
    
  • Source的值就是我们给容器指定的数据盘在主机上的位置

  • Destination的值是这个数据盘在容器上的位置

12.2 指定数据盘 [#](#t3212.2 指定数据盘)

mkdir ~/data
docker run -v ~/data:/mnt -ti --name logs2 centos bash
cd /mnt
echo 3 > 3.txt
exit
cat ~/data/3.txt

12.3 指定数据盘容器 [#](#t3312.3 指定数据盘容器)

docker create -v /mnt --name logger centos
docker run --volumes-from logger --name logger3 -i -t centos bash
docker run --volumes-from logger --name logger4 -i -t centos bash

12.4 管理数据盘 [#](#t3412.4 管理数据盘)

docker volume ls 列出所有的数据盘
docker volume ls -f dangling=true 列出已经孤立的数据盘
docker volume rm xxxx
docker volume ls
docker rm logger1 logger2
docker volume inspect xxx
docker rm logger -v

13.compose #

Compose 是一个用户定义和运行多个容器的 Docker 应用程序。在 Compose 中你可以使用 YAML 文件来配置你的应用服务。然后,只需要一个简单的命令,就可以创建并启动你配置的所有服务。 使用 Compose 基本会有如下三步流程:

  • 在 Dockfile 中定义你的应用环境,使其可以在任何地方复制。

  • 在 docker-compose.yml 中定义组成应用程序的服务,以便它们可以在隔离的环境中一起运行。

  • 最后,运行docker-compose up,Compose 将启动并运行整个应用程序。

    pip install docker-compose

13.1 blog [#](#t3613.1 blog)

Dockerfile

FROM node
RUN npm i express-generator -g
RUN express app
WORKDIR app
RUN npm install
EXPOSE 3000
CMD ["npm","start"]

13.2 nginx [#](#t3713.2 nginx)

FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80

nginx.conf

events{
    use epoll;
}
http {
  server {
    listen 80;
    location / {
      proxy_pass http://blog:3000;
    }
  }
}

13.3 docker-compose.yml [#](#t3813.3 docker-compose.yml)

version: '1'
services:
   blog:
     build: blog
     networks:
      - default
     ports:
      - "3000:3000"

   nginx:
     build: nginx
     networks:
      - default
     ports:
      - "80:80"

13.4 启动 [#](#t3913.4 启动)

docker-compose up -d

Gitalking ...

Markdown is supported

Be the first guy leaving a comment!