原文http://blog.peoplevip.cn/2018/ce28352e.html
因为要把一些服务进行docker部署,系统的学习了一下docker的使用,不说原理,网上很多,只记录一些命令
docker类似于虚拟机,但是又不同于虚拟机,所有的容器以及镜像都是基于精简的linux系统进行展开(划重点,刚开始学习过程中一直在疑惑怎么跑起来一些服务的)
自定义镜像
获取镜像有两种方式,第一种
方式是从网上pull下来,然后根据要求更改(如果有现成的可以不改),第二种
方式,使用Dockerfile文件
一
获取
docker pull ubuntu
启动
docker run -it -d --name test-ubuntu ubuntu
这样就从ubuntu这个镜像上新建了一个容器
查看后台运行的容器
docker ps
进入
docker attach 上方的id
可以看到是一个精简的Ubuntu系统
安装完想要的东西后,生成新镜像(可选)
docker commit --change='CMD ["python /app/Api.py"]' -c "EXPOSE 22" flask ubuntu
其他命令后面补上
二
基于在Dockerfile中的指令,我们可以使用Docker build
命令来创建镜像。通过减少镜像和容器的创建过程来简化部署。
以创建一个python Flask为例
新建一个目录,名称随意
mkdir python
cd python
vim Dockerfile
输入以下内容
#根镜像
FROM daocloud.io/ubuntu:trusty
MAINTAINER tsvico tsxygwj@163.com
# APT 自动安装 PHP 相关的依赖包,如需其他依赖包在此添加
RUN apt-get update && \
apt-get install -y python \
python-dev \
python-pip \
vim \
# 用完包管理器后安排打扫卫生可以显著的减少镜像大小
&& apt-get clean \
&& apt-get autoclean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
ADD re.txt re.txt
RUN pip install -r re.txt
# 配置默认放置 App 的目录
RUN mkdir -p /app
WORKDIR /app
COPY ./test /app
#开放8080端口
EXPOSE 8080
CMD ["python /app/Api.py"]
注:re.txt放在python目录下,是我flask环境的一些依赖,把程序源码同样拷贝到python目录,放在新建文件夹test目录下,
FROM
: 必不可少的命令,从某个镜像作为基。如 FROM <image_name> ,或者 FROM <image_name>:. 如果不加tag,默认为latest。先从本地镜像仓库去搜索基镜像,如过本地没有,在去网上docker registry去寻找。
MAINTAINER
:标明该Dockerfile作者及联系方式,可忽略不写
RUN
:建立新的镜像时,可以执行在系统里的命令,如安装特定的软件以及设置环境变量。
ENV
:设置系统环境变量(注意:写在/etc/profile里的命令在dockerfile这里会不生效,所以为改成ENV的方式)
EXPOSE
:开放容器内的端口,但不和宿主机进行映射。方便在宿主机上进行开发测试。(如需映射到宿主机端口,可在运行容器时使用 -p host_port:container_port)
CMD
:设置执行的命令,经常用于容器启动时指定的某个操作。如执行自定义脚本服务,或者是执行系统命令。CMD 只能存在一条,如在Dockerfile中有多条CMD的话,只有最后一条CMD生效!
文件中每一条RUN命令都为一层,一次写完最好,详情Google.com
#构建
docker build -t ubuntu-flask .
最后的.不能缺少
常用命令
启动服务
docker run -d -p 8080:8080 --name=api flask-api:latest python /app/Api.py
//拉取镜像
docker pull <仓库地址>/<镜像名>:<镜像tag>
//启动容器
docker run -it <镜像名>:<镜像tag> /bin/bash
eg docker run -t -i ubuntu:14.04 /bin/bash
//后台守护进程启动
docker run -dit <镜像名>:<镜像tag> /bin/bash
docker run -dit training/webapp python app.py
-d即是以守护态运行
//自定义端口映射,启动服务
宿主机到容器内的端口映射
docker run -dit -p <hostPort>:<containerPort> --name <自定义容器名> <镜像名>:<镜像tag> /bin/bash && command1 command2
eg docker run -dit -p 5000:5000 training/webapp python app.py
-P:默认匹配docker容器的5000端口号到宿主机的49153 to 65535端口
-p <HOT_PORT>:<CONTAINER_PORT>:指定端口号
--name <自定义容器名>
//查看容器进程
docker ps -a //查看所有容器
docker ps //查看运行中容器
//查看docker的一些底层信息
docker inspect
//重新启动之前的容器
docker start -i 容器名或者id
//删除容器
docker rm 容器id
//删除镜像
docker rmi 镜像id
//退出交互式容器:后台
Ctrl + p Ctrl+Q
进入已经退出的容器
docker attach id/name
直接后台
docker run -d 容器
//查看日志
docker logs -t(时间) -f(更新) 容器名
//查看容器内进程
docker top name
//在容器中启动新进程
docker exec [-d][-i][-t] 容器名[COMMAND][ARG...]
ps: docker exec -i -t 名字 进程
//将容器另存为镜像
docker commit --change='CMD ["启动命令,可选"]' -c "EXPOSE 22" centos123 centos