Docker的基本使用

1. Docker一些基础的概念

1.1 docker与传统虚拟化的区别
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

1.2 镜像
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

1.3 容器
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。

1.4 仓库
仓库很容易理解,就是镜像的集合。

2.基本命令

2.1 docker操作命令介绍

docker run --rm -ti ubuntu /bin/bash 创建并启动
–rm 一旦进程退出,则删除容器
-ti 进入交互模式
ubuntu 容器的镜像名字
/bin/bash 要运行的命令
docker ps -a(显示所有容器,包括已经stop的)
docker exec -ti centos /bin/bash 进入容器内部(shell)
docker attach container 进入容器交互式界面
docker diff  container 列出容器内发生变化的文件与目录
dcoker logs ID(容器的ID,可以用docker ps查看)   查看docker上的容器的状态
docker stop ID(或者容器名字)  关闭运行中的容器
docker start ID 开启容器
docker restart ID  重启运行中的容器
docker stop ID docker rm ID  移除容器(先关闭再删除)
docker kill [options] container 杀死容器的主进程
docker stop $(docker ps -a -q) 停止所有container
docker rm $(docker ps -a -q)   移除所有container
docker commit ID new镜像名字(只能字母加数字) 将容器的状态保存为镜像
docker export container > test.tar  将容器打包成tar文件
docker cp container:path hostpath  从容器内复制文件到指定的路径

2.2.镜像操作命令

docker images -a  -a可以查看所有的image
docker search (image-name) 查询镜像 example:docker search ubuntu
docker history (image-name) 查看镜像的历史版本
docker push (image-name) 将镜像推送到registry
docker pull image-name:tag pull镜像 example:docker pull ubuntu:latest
docker rmi  <image id>   删除镜像(先stop并删除镜像上的所有容器)
docker rmi $(docker images -q) 删除全部镜像
docker tag image-id imagename:tag 修改镜像的tag标签
docker load -i test.tar 从tar文件中载入镜像
docker save image > test.tar 保存镜像为tar文件

2.3其他命令

docker import http://example.com/example.tar  远程导入文件
docker login [options][server]  用来登陆自己的registry
docker inspect container/image  收集容器的信息(ip地址,端口等)
docker wait container  阻塞

3.Dockerfile

3.1 基本概念
理解docker中一些基本概念,并完成docker安装下一步就是学习docker的使用。对于大多数开发人员来说,docker使用过程中最为核心的部分就是Dockerfile。

Dockerfile是一个文本文件,它包含了一些指令,docker镜像的构建就是通过Dockerfile中的这一条一条的指令完成的。也就是说,要构建一个镜像,就需要一个Dockerfile,然后根据自己的需求配置一些指令集合,下面就看一下Dockerfile中使用的一些指令。

FROM:指定基础镜像

定制我们的镜像,是需要以一个镜像为基础的,就是基础镜像,例如Ubuntu、 nginx、postgres、mysql等,例如,FROM Ubuntu:16.04,如果本地有Ubuntu基础镜像则使用本地基础镜像,如果没有则会到官方镜像仓库拉取,16.04是镜像版本号,如果不指定则会拉取lastest。

RUN:执行命令

RUN指定我们在构建镜像时需要执行的命令,比如apt-get install安装某个软件,pip install安装Python依赖包,配置软件源,配置时区等, 例如,RUN apt-get install python3。

ADD和COPY:文件操作

ADD和COPY是两个功能类似的指令,一般优先使用COPY,它比ADD更透明,它的功能是将本地文件拷贝到容器中,例如,COPY ./ /home/jackpop/test。

WORKDIR:指定工作路径

指定镜像的运行时的工作路径,例如,WORKDIR /home/jackpop/test 。

ENTRYPOINT:设置镜像主命令

指定镜像运行是运行的命令,例如, ENTRYPOINT [“python”, “-m”, “main”]。

LABEL:添加标签

可以为镜像添加标签来帮助组织镜像、记录许可信息、辅助自动化构建等。

CMD:执行目标镜像中包含的软件

如果创建镜像的目的是为了部署某个服务,可能会执行某种形式的命令,可以包含参数。

EXPOSE:指定监听端口

给外部访问指定访问端口。

ENV:环境变量

为了方面程序运行,有时需要更新环境变量。

VOLUME:暴露数据库存储文件

USER:指定当前用户

其中常用的命令就是FROM、COPY、WORKDIR、RUN、ENTRYPOINT。

3.2 操作流程

了解了Dockerfile的常用指令,我们该怎么对镜像和容器进行操作呢?下面就来学习一下docker常用的一些命令,

备注:由于我已经把当前用户加入到docker用户组,所以下面命令没有加sudo,如果没有加用户组需要使用sudo docker。
查看本地镜像

$ docker image ls
REPOSITORY  TAG  IMAGE ID  CREATED  SIZE
ubuntu  16.04  ******  10 days ago  119MB
查看容器

$ docker ps -a
CONTAINER  ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES
***  ***  ***  ***  ***  ***  ***  ***
启动、停止、重启容器

$ docker start $container_id
$ docker stop $container_id
$ docker restart $container_id
退出和进入镜像

$ exit
$ docker exec $container_id /bin/bash
启动镜像
$ docker run $image_id

可以用--p和--dns指定端口和dns来配置网络。

container_id是容器ID,image_id是镜像ID。

拉取镜像
$ docker image pull ubuntu

从Dockerfile创建镜像
$ docker build

从一个修改的容器创建镜像
$ docker commit

容器与本地之间复制文件
$ docker cp

推送镜像
$ docker push

为镜像打标签
$ docker tag

重命名容器
$ docker rename

删除容器
$ docker rm

删除镜像
$ docker rmi

搜索镜像
$ docker search

3.3 实践

3.3.1 创建项目

Test/
├── Dockerfile
└── main.py

3.3.2写一个简单的测试程序

#main.py

import logging
from time import sleep
import numpy as np
​
logging.basicConfig(level=logging.DEBUG,
                    format="'%(asctime)s - "
                           "%(filename)s[line:%(lineno)d] - "
                           "%(levelname)s: %(message)s")
​
​
def main():
    for i in range(10):
        logging.debug(np.random.randint(0, 5))
        sleep(0.1)
​
​
if __name__ == '__main__':
    main()

3.3.4 Dockerfile
这是构建镜像中的重点部分,

FROM ubuntu:16.04
​
COPY ./ /home/Test_docker
WORKDIR /home/Test_docker
​
RUN apt-get update && apt-get install -y python3 python3-pip \
&& ln -s pip3 /usr/bin/pip \
&& ln -sf /usr/bin/python3 /usr/bin/python \
&& rm -rf ls /var/cache/apt/* \
​
ENTRYPOINT ["python3", "-m", "main"]

3.3.5 进入项目根目录

$ cd Test

3.3.6 开始构建

$ docker build test:v1.0 .
test是指定构建镜像的名称,v1.0指定镜像标签,如果不指定,镜像名称和标签会显示为none。
运行镜像

$ docker run $image_id
'2019-06-29 12:26:38,298 - main.py[line:13] - DEBUG: 0
'2019-06-29 12:26:38,399 - main.py[line:13] - DEBUG: 2
'2019-06-29 12:26:38,499 - main.py[line:13] - DEBUG: 1
'2019-06-29 12:26:38,599 - main.py[line:13] - DEBUG: 3
'2019-06-29 12:26:38,699 - main.py[line:13] - DEBUG: 0
'2019-06-29 12:26:38,799 - main.py[line:13] - DEBUG: 4
'2019-06-29 12:26:38,900 - main.py[line:13] - DEBUG: 4
'2019-06-29 12:26:39,000 - main.py[line:13] - DEBUG: 4
'2019-06-29 12:26:39,100 - main.py[line:13] - DEBUG: 4
'2019-06-29 12:26:39,200 - main.py[line:13] - DEBUG: 2

当然也可以在基础镜像的基础上进行修改来创建我们的镜像,例如,我们拉取一个Ubuntu基础镜像,可以启动镜像后安装我们需要的软件和环境,然后利用docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]来创建一个新镜像。

4. docker中mysql数据库的持久化

解决方案就是:挂载一个本地文件到Container (Mount a local folder from the host on the container to store the database files).

首先我们停掉之前的Container

docker stop mysql

我们指定一个本地可以挂载的路径,重新启动tutum-docker-mysql.我们指定/home/walter/softwares/tutum-docker-mysql/data 挂到Container里的/var/lib/mysql目录(-v Bind mount a volume). 这样子我们就可以将数据持久化在主机(Host)的目录中了。

sudo docker run -d -p 3306:3306 -v /home/walter/softwares/tutum-docker-mysql/data:/var/lib/mysql -e MYSQL_PASS="mypass" tutum/mysql

我们在上面启动的时候顺便指定了创建密码为mypass,我们现在登陆一下mysql创建一些数据,看看会不会被保存下来

shell>mysql -uadmin -pmypass -h127.0.0.1
mysql>create database test;

退出mysql,重启Container,我们发下我们做的操作将会被保留下来.我们之后每一次启动这个mysql都可以使用下面的命令

docker run -d -p 127.0.0.1:3306:3306 -v /home/walter/softwares/tutum-docker-mysql/data:/var/lib/mysq
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值