布署软件的问题
- 如果想让软件运行起来要保证操作系统的设置,各种库和组件的安装都是正确的
- 热带鱼&冷水鱼 冷水鱼适应的水温在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架构)
#
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.composeCompose 是一个用户定义和运行多个容器的 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 ...
Be the first guy leaving a comment!