Docker入门及其实践

0 前言

最近在做一个比赛,要求使用docker提交,就入门了一下。在入门的过程中,网上关于docker的内容太理论和繁琐,这里给出一个快速上手并使用docker的方法。

1 Dcoker基础

关于docker入门的第一步请参考,下面的两个网址,我就不重复造轮子了,看的很快:
Docker 教程
https://yeasy.gitbooks.io/docker_practice/content/image/dockerfile/entrypoint.html
需要说明几点:

  1. Docker有一个默认的Docker hub,默认pull和push都是基于这个仓库的。可以把本地的镜像,上传到Docker hub也可以从docker hub下载镜像。
  2. 修改使用的仓库请参考:https://www.runoob.com/docker/docker-login-command.html
  3. 容器并不是一次性的,容器创建后是一直存在的,可以重复运行。有关怎么重复运行创建好的容器,下面还会讲到。

2 如何上手使用docker

可能看完了上面的教程你还是不知道到底应该怎样使用docker,如我有了一个dcoker镜像,怎么把自己的代码放进入呢,怎样安装依赖呢。下面我就讲一下,到底该怎样快速上手一个dcoker。

  1. 首先我们应该有一个基础的镜像,可以从默认的Docker hub中pull下载一个,如我们想要一个ubuntu16.04,可以在默认的仓库中拉取。如果我们想使用python环境可以直接找一个带有python的ubuntu镜像,这样就不需要自己安装python了。
  2. 如果我们已经拉取了一含有python的镜像,怎么安装自己需要的包呢?使用这个镜像启动一个交互式的容器,使用pip安装需要的包,就像在普通的ubuntu系统一样。
  3. 讲自己的项目拷贝进当前的镜像,具体怎么拷贝下面会进行介绍。
  4. 拷贝完了之后,还没有结束,我们发给别人的不是一个容器,而是一个镜像文件,怎么把容器中的内容放入一个镜像文件呢,这样别人才能运行我们的项目。答案就是使用commit命令将一个容易保存成镜像,commit的使用下面会讲。
  5. 竞赛的docker一般还会要求,使用你的镜像创建容器的时候可以,自动执行你的一个脚本进行测试。这个时候就要基于你上面保存的镜像,使用build命令基于Dockerfile再生成一个镜像并指定容器启动时运行你的测试脚本。
    一个简单实现这种目的Dockerfile:
    From iqiyi:4.0
    MAINTAINER lavi "[email protected]"
    WORKDIR /
    ENTRYPOINT cd iqiyi && python test1.py
    
  6. 使用login命令切换仓库,并把你的镜像push上去。
    以上就是竞赛中使用Docker提交的基本流程。

3 使用的Dcoker命令

3.0 将主机文件上传到docker容器

docker cp 本地文件路径 ID全称:容器路径

3.1 login pull和push

sudo docker login --username=[username] hub.baidubce.com #切换仓库
sudo docker pull 镜像名:tag #从仓库拉取镜像到本地
sudo docker push 镜像名:tag  #上传镜像到仓库

3.2 容器的创建、启动及使用

1. docker run 创建并启动一个容器

sudo docker run -i -t ubuntu /bin/bash

让我们来分析一下这条简单的命令吧:

  • 首先,我们给Docker执行的是docker run命令。
  • 此外,我们指定了两个参数,分别是-i和-t。
    -t:在新容器内指定一个伪终端或终端。
    -i:允许你对容器内的标准输入 (STDIN) 进行交互。
    Ps:通常-i和-t两个参数会联合使用,也可以写作-it。
  • 接下来,我们可以看到命令行中输入了ubuntu。
    它是在告诉Docker基于哪个镜像来创建容器。
    在我们指定某个镜像后,Docker首先会检查本地是否存在该镜像,如果没有找到该镜像,那么首先会连接到官方维护的Docker Hub Registry进行查找并下载。
  • 最后的/bin/bash则指定了该容器需要运行的命令。
    命令完成后,我们将会看到我们进行了该容器内的shell:
    root@41225bc38698:/#
  • 总结一下,该命令最基本的运行格式如下:sudo docker run -i -t 镜像名称 命令代码
    在执行完刚才的命令后,我们已经以root用户进入到了新容器中。 该容器可以认为是一个完整的ubuntu系统,可以正常使用。 例如,我们可以试下如下命令:
root@41225bc38698:/# hostname
# 41225bc38698
root@41225bc38698:/# cat /etc/hosts
 # 172.17.0.8 41225bc38698
 # 127.0.0.1 localhost
 # ::1 localhost ip6-localhost ip6-loopback
 # fe00::0 ip6-localnet
 # ff00::0 ip6-mcastprefix
 # ff02::1 ip6-allnodes
 # ff02::2 ip6-allrouters

此外,我们还可以安装一个软件包,以vim为例:

apt-get update && apt-get install vim

执行如下命令后,我们可以成功的安装完成vim。 当我们使用完成该容器后,可以使用exit来退出容器。
此时,容器会停止命令,同时我们回到了宿主机的命令行提示符。 Ps:此时,容器仅仅是停止运行,但是并没有被销毁。 我们可以使用如下命令查看当前系统中存在的容器:

docker ps -a

其中,默认docker ps命令会查询到所有正在运行的容器,添加参数-a后,则无论是否在运行中,都会被查找到。
从上表可以看出,我们可以通过docker ps命令可以查询到容器的很多有用信息,包括:ID、镜像、命令、创建时间、退出状态、端口以及容器名称等
2. 创建一个指定名称的容器,并启动
我们已经提到了每个容器都有其对应的一个名称。 默认情况下,如果没有指定容器名称,系统将会自动随机生成一个唯一的名称。 当然,我们也可以直接来指定容器的名称,此时,使用–name 容器名来实现。
例如:

sudo docker run --name nianshi_test -i -t ubuntu /bin/bash

此时,我们将会创建一个容器名称为nianshi_test的容器。 一个合法的容器名称是只能由字母、数字、下划线、圆点和横线组成的。
Ps:容器名称必须是唯一的,如果我们试图创建两个同名的容器时将会失败。容器名称是一个可以替代容器id的有利工具,合理利用容器名称可以大幅提高工作效率。
3. 启动已停止的容器
当一个容器已经停止后,我们可以使用docker start命令来重新启动该容器。
根据容器名称启动 sudo docker start nianshi_test
根据容器id启动sudo docker start 41225bc38698
在我们重新启动容器后,将会继续沿用之前docker run运行时的参数来运行。但是,此时我们并没有直接进入到交互式shell的环境。 需要再次执行如下命令才能进行到交互式shell的环境:

sudo docker attach nianshi_test

ps:有时在执行完该命令后,需要再次敲击一个回车才能看到交互式shell。
还可以把start换成restart,重新启动一个容器。
4.创建守护式容器
在之前的内容中,我们主要讲解了如何创建一个交互式的环境。 还有更多的时候,我们可以期望是创建一个长期运行的容器。对于此类容器,我们称之为守护式容器,它们没有交互式会话,非常适合应用程序和服务运行。 以下面的代码为例:

sudo docker run --name nianshi_test1 -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
# 066762ca46506b0ed27aaeb266da6b662e38111604150a3448dc2adae7449b31

其中,我们可以看到在docker run命令中,我们使用了-d参数,表示将程序放在后台执行。

而执行脚本的本身含义则表示每隔1s打印一个hello world,直到容器停止。
5. 查看容器日志

那么我们如何看这些守护式容器的日志呢? Docker本身提供了docker logs用于日志查询。

sudo docker logs nianshi_test1

该命令会输出最后几条日志并返回。 更为推荐的一种方式是添加-f参数,用于监控容器的日志,功能类似于tail -f。

sudo docker logs -f nianshi_test1

此外,我们还可以使用-t-参数来添加时间戳。

sudo docker logs -f -t nianshi_test1
# 2018-01-23T03:56:40.821800852Z hello world
# 2018-01-23T03:56:41.822581880Z hello world

有关容器的更多操作请参考:Docker新手入门之三:Docker容器的基本使用

3.3 commit命令从一个容器创建一个镜像

docker build -t aicontest-demo:1.0 -f /path/to/your/Dockerfile 上下问路径

3.4 build命令使用Dcokerfile文件创建一个镜像

sudo docker build 

3.5 常用的查询命令

1.查看当前有些什么images

docker images

2.查看多有的容器

docker ps -a

2.查看多有的容器,只显示容器id

docker ps -a -p

3.6 删除镜像和容器

1.停止所有的container,这样才能够删除其中的images:

docker stop $(docker ps -a -q)

2.如果想要删除所有container的话再加一个指令:

docker rm $(docker ps -a -q)

3.删除images,通过image的id来指定删除谁

docker rmi 

4.想要删除untagged images,也就是那些id为的image的话可以用

docker rmi $(docker images | grep "^" | awk "{print $3}")

5.要删除全部image的话

docker rmi $(docker images -q)

注:所有的docker命令如果提示权限问题的话,请加sudo

3.7 tag命令重命名镜像

docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签)

#例子
docker tag ca1b6b825289 registry.cn-hangzhou.aliyuncs.com/xxxxxxx:v1.0

参考文献

  1. Docker 容器镜像删除
  2. Docker 重命名镜像 TAG
  3. Docker新手入门之三:Docker容器的基本使用

你可能感兴趣的:(Docker,Docker)