# Docker

# 容器和虚拟机的区别

  • 容器是APP层面的隔离

  • 虚拟化是物理资源层面的隔离

# Vagrant

  1. 下载 VirtualBox && Vagrant

  2. 在一个目录下生成 Vagrantfile,并启动。

vagrant init centos/7
# 启动
vagrant up
# 登录
vagrant ssh
# 状态
vagrant status
# 关闭
vagrant halt
# 删除
vagrant destroy

# 安装 Docker

https://docs.docker.com/install/linux/docker-ce/centos/ (opens new window)

# 启动
sudo systemctl start docker

# Docker 介绍

  • Docker 提供了一个开发,打包,运行app的平台,把app和底层的 infrastructure 隔离开来。

  • docker client 与 server(dockerd) 通过 REST API通信,所以可以在同一台机器上,也可以在不同的机器上通过网络来通信。

# Image & Container

# sh

# docker

# image list
docker image ls
# remove image
docker rmi image-name
# container list (include stoped c)
docker ps -a
# run container
docker run hello-world
# run container and interactive execution 
docker run -it image-name /bin/bash
# list of container id
docker container ls -aq
# Force-remove a running container
docker rm -f container-name
# rm all container
docker rm $(docker ps -aq)
docker rm $(docker ps -f "status=exited" -q)
# Remove all stopped containers
docker rm $(docker ps -aq)
# build image
docker build -t image-name .
# 如果build出现问题,可以采用交互式进入debug问题
docker run -it b9533a95a065 /bin/bash
# 端口映射
docker run -d -p 8080:80 image-name 
# 后台运行
docker run -d vanoneang/node-hell
# 交互式进入运行的container中
docker exec -it aa4869b97116 /bin/bash
# 查看network
docker network ls
# 查看某个container的网络详细(上一个命令的 NETWORK ID bridge),拿到IP地址
docker network inspect d2b09b5d9aeb
# 设置container flask-redis的环境变量 REDIS_HOST=redis,如果容器中的程序需要通过读取环境变量的方式来读取配置,这样可以设置不同的环境变量
docker run -d --link redis --name flask-redis -e REDIS_HOST=redis vanoneang/flask-redis

# Dockerfile

FROM scratch # 制作base image
FROM centos  # 使用base image
LABEL maintainer="123@qq.com" 
LABEL version="1.0.0"
LABEL description="帮助信息"
RUN yum update && yum install -y vim # 为了避免出现多个层(layer)尽量把命令写在一行
WORKDIR /test # 如果没有会自动创建test目录
WORKDIR demo
RUN pwd # 输出结果应该是 /test/demo 避免使用 RUN cd
ADD test.tar.gz /  # 添加到根目录并解压

WORKDIR /root
ADD hello.js test/ # /root/test/hello.js

WORKDIR /root
COPY hello.js test/ # /root/test/hello.js COPY 比 ADD 优先使用,
ENV MYSQL_VERSION 5.6 # 设置常量
RUN apt-get install -y mysql-server="${MYSQL_VERSION}" \
    && rm -rf /var/lib/apt/lists/* # 引用常量
ADD test.sh /root/home
RNTRYPOINT ["test.sh"]  # 永远会执行

CMD echo "hello world"
CMD echo "hello docker" # 只执行最后一个
FROM ubuntu
RUN apt-get update && apt-get install -y stress
ENTRYPOINT ["/usr/bin/stress"]
CMD [] # 通过命令行输入参数,上一行的ENTRYPOINT是命令

docker run -it 打包后的镜像 [参数]

# 端口映射

# 将container的80端口映射到服务器的80端口
docker run --name web -d -p 80:80 nginx