因为要把一些服务进行docker部署,系统的学习了一下docker的使用,不说原理,网上很多,只记录一些命令
docker类似于虚拟机,但是又不同于虚拟机,所有的容器以及镜像都是基于精简的linux系统进行展开(划重点,刚开始学习过程中一直在疑惑怎么跑起来一些服务的)
自定义镜像
获取镜像有两种方式,第一种
方式是从网上pull下来,然后根据要求更改(如果有现成的可以不改),第二种
方式,使用Dockerfile文件
一
获取
启动
1
| docker run -it -d --name test-ubuntu ubuntu
|
这样就从ubuntu这个镜像上新建了一个容器
查看后台运行的容器
进入
可以看到是一个精简的Ubuntu系统
安装完想要的东西后,生成新镜像(可选)
1
| docker commit --change='CMD ["python /app/Api.py"]' -c "EXPOSE 22" flask ubuntu
|
其他命令后面补上
二
基于在Dockerfile中的指令,我们可以使用Docker build
命令来创建镜像。通过减少镜像和容器的创建过程来简化部署。
以创建一个python Flask为例
新建一个目录,名称随意
1 2 3
| mkdir python cd python vim Dockerfile
|
输入以下内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #根镜像 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 ,或者 FROM :. 如果不加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
1 2 3
| #构建 docker build -t ubuntu-flask . 最后的.不能缺少
|
常用命令
启动服务
docker run -d -p 8080:8080 --name=api flask-api:latest python /app/Api.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| //拉取镜像 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
|