[关闭]
@aloxc 2019-05-02T22:19:04.000000Z 字数 7116 阅读 314

docker总结

docker


特别注意,golang程序可能编译后会有问题,需要设置不使用cgoCGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main

1、基本概念

镜像(image):就是一个只读的模板,类似于打包好的操作系统iso文件

容器(container):使用镜像启动的系统,类似我们安装好的win7

仓库(Repository):就是保存镜像的地方,官方仓库hub.docker.com

注册器(Registry):就是创建仓库的,分为公有和私有

一个Registry有多个仓库,一个仓库有若干个镜像,可以使用一个镜像创建若干个容器。

2、基本操作

2.1、安装docker

Ubuntu 16.04 安装 Docker

1.选择国内的云服务商,这里选择阿里云为例

  1. curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -

2.安装所需要的包

  1. sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual

3.添加使用 HTTPS 传输的软件包以及 CA 证书

  1. sudo apt-get update
  2. sudo apt-get install apt-transport-https ca-certificates

4.添加GPG密钥

  1. sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

5.添加软件源

  1. echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo tee /etc/apt/sources.list.d/docker.list

6.添加成功后更新软件包缓存

  1. sudo apt-get update

7.安装docker

  1. sudo apt-get install docker-engine

8.启动 docker

  1. sudo systemctl enable docker
  2. sudo systemctl start docker

2.2、基本操作

2.2.1、启动和停止docker

  1. #启动docker
  2. sudo systemctl enable docker
  3. sudo systemctl start docker
  4. #停止docker
  5. sudo systemctl stop docker

2.2.2、使用第三方Registry,在国内访问官方镜像仓库可能会很慢,可以使用第三方Register

新建或者编辑配置文件 /etc/docker/daemon.json

添加如下代码

  1. {
  2. "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"]
  3. }

保存退出后重启docker

  1. sudo systemctl restart docker

2.2.3、拉取镜像,一个完整的镜像是包含镜像名和tag,如果不写tag就默认的拉取latest的

  1. #示例拉取mysql最后的版本latest
  2. sudo docker pull mysql
  3. #示例拉取mysql的5.6.43,注意5.6.43是tag
  4. sudo docker pull mysql:5.6.43

2.2.4、罗列镜像

  1. sudo docker images

2.2.5、删除镜像

  1. #使用镜像名称
  2. sudo docker rmi mysql
  3. #使用镜像的Image ID(只需要写出部分)
  4. sudo docker rmi bb
  5. #使用镜像名称和tag,中间使用冒号分割
  6. sudo docker rmi mysql:5.6.43

如何确定一个镜像

1.使用tag

2.使用镜像名

3.使用镜像名和tag

2.2.6、镜像的导入和导出

导出镜像,当某的时候可能别的机器需要某个镜像,但是目标机器无法上网或者其他原因,我们可以把我们现有的镜像导出成一个压缩包,

  1. #save命令,后面跟着镜像名称和tag然后 > 到保存镜像的目录和文件名称
  2. sudo docker save nginx:latest >./nginx.dk

导入镜像

  1. sudo docker load < ./nginx.dk

2.2.7、启动容器

  1. #参数说明,
  2. # -it表示是使用交互方式
  3. # --name后面跟着的是给即将启动的容器一个名字,名字和运行中的容器不能一样
  4. # 接下来就是镜像名称和tag
  5. # 最后的/bin/bash就是容器起来后要打开的命令行(容器中的命令行)
  6. sudo docker run -it --name mycentos centos:latest /bin/bash

非交互方式启动容器后,如果想进入的话,可使用如下命令

  1. sudo docker exec -it mynginx /bin/base
  2. #如果报错,可使用如下试试
  3. sudo docker exec -it mynginx /bin/sh

2.2.8、停止容器

  1. #使用容器的名称
  2. sudo docker stop mynginx
  3. #使用容器的容器id(一部分就可以了)
  4. sudo docker stop bb

停止所有容器

  1. sudo docker stop 'sudo docker ps -q'

2.2.9、罗列运行中的容器

  1. sudo docker ps

该命令可选如下参数

2.2.10、删除容器

删除容器

  1. sudo docker rm 容器名称或者容器id

删除所有容器

  1. sudo docker rm 'sudo docker ps -a -q'

2.2.11、不想每次执行命令都输入sudo

  1. sudo groupadd docker
  2. sudo gpasswd -a ubuntu docker
  3. sudo service docker restart
  4. 重新进入shell

2.2.12、容器列表

  1. sudo docker container ls

2.2.13、

3、docker应用

3.1、搭建tomcat应用

3.1.1、拉取tomcat镜像

  1. sudo docker pull tomcat

3.1.2、启动tomcat

参数说明:

  1. sudo docker run -d --name mytomcat -p 8888:8080 tomcat:latest

我们使用curl http://localhost:8888看看是否有输出,有就表明mytomcat这个容器已经运行了。

3.1.3、写一个简单的web应用,并打包成war包,名字我们就用docker.war

3.1.4、把war包上传到tomcat的webapps目录

  1. sudo docker cp docker.war mytomcat:/usr/local/tomcat/webapps/

3.1.5、浏览我们开发的页面

  1. curl http://localhost:8888/docker/

4、其他工具

playground 一个练习的虚拟环境,有时间限制,地址:

https://labs.play-with-docker.com,使用docker.com账号登录

5、制作镜像

5.1、制作一个新的镜像

先编写一个程序,本例子使用golang

  1. package main
  2. import "fmt"
  3. func main() {
  4. fmt.Println("你好,docker!本例使用golang创建的可执行文件")
  5. }

进到该程序的目录执行编译生成hellodocker

  1. go build -o "hellodocker"

编写Dockerfile

vi Dockerfile

  1. FROM scratch
  2. ADD hellodocker /
  3. CMD ["/hellodocker"]

保存

命令说明:

第一行表示新建一个base image

第二行是把我们编译生成的hellodocker放到image的根目录

第三行表示执行hellodocker程序

  1. docker build -t aloxc/hellodocker .

命令说明,docker build 表示执行镜像制作,-t 指定tag,后面的aloxc是对应hub.docker.com里面的账户名称,hellodocker是镜像名称 ,.点好表示从当前目录找Dockerfile

  1. docker images

可以看到我们刚制作好的镜像

  1. #查看我们制作的image的分层,后面的参数是image id
  2. docker history 5b6d6c39bd25

现在我们启动下该容器

  1. docker run 5b6d6c39bd25

5.2、用一个base image重新build出一个新的image

  1. docker run -it centos

启动一个centos,进入交互界面,在容器中安装vim

  1. yum install -y vim
  2. exit

在宿主机执行下面命令,罗列出所有的容器

  1. docker container ls -a

  1. docker commit stupefied_mendeleev aloxc/centos-vim

命令说明:

docker commit 是从现有容器制作一个新的镜像

stupefied_mendeleev 是我们运行centos的names,如上图中

aloxc对应hub.docker.com中的用户id

centos-vim是新的镜像名字

执行完毕会生成一个新的image,docker images

从结果中我们可以看到,的确有个新的镜像aloxc/centos-vim

我们可以通过命令查看之前的centos和现在的centos-vim分层结构,有部分一样的分层。红色框是一样的,蓝色是新的centos-vim多出的层

  1. docker history centos
  2. docker history aloxc/centos-vim

不推荐使用原来有的容器创建一个新的镜像

5.3、使用已有的镜像制作新的镜像

新建Dockerfile,vi Dockerfile

  1. FROM centos
  2. RUN yum install -y vim

执行生成镜像的命令

  1. docker build -t aloxc/centos-vim2 .

命令说明:docker build 表示执行镜像制作,-t 指定tag,后面的aloxc是对应hub.docker.com里面的账户名称,centos-vim2是镜像名称 ,.点好表示从当前目录找Dockerfile

  1. docker images

6、Dockerfile最佳实现及语法

6.1、FROM 关键词

FROM scratch #制作一个base image

FROM centos #使用一个base image

FROM ubuntu:18.04 使用其它的image

最佳实践:尽量使用官方的进行作为base image

6.2、LABEL关键词

该关键词定义了一些镜像中的matadata,类似我们写程序中的代码注释,最佳实践:Metadata不可少,LABEL可以添加多个,如下

  1. LABEL maintainer="abc@gmail.com"
  2. LABEL version="1.0"
  3. LABEL description="this is a description"

6.3、RUN关键词

就是需要在制作镜像的时候可能需要安装一些软件或者其它命令,最佳实践:每一个RUN就会新生成一层,所有尽量多个命令写到一行,命令太长可使用反斜线换行

  1. RUN yum update && yum install -y vim\
  2. python-dev #反斜线换行
  1. RUN apt-get update && apt-get install -y perl\
  2. pwgen --no-install-recommends && rm -rf \
  3. /var/lib/apt/lists/* #注意清理缓存
  1. RUN /bin/bash -c 'source $HOME/.bashrc;echo $HOME'

6.4、WORKDIR关键词

设定当前工作目录,类似linux中的cd,

  1. WORKDIR /test #如果没有test目录会自动创建test目录
  2. WORKDIR demo #进入到test/demo
  3. RUN pwd #输出结果应该是/test/demo

WORKDIR最佳实践:尽量使用WORKDIR,尽量不要使用RUN cd;尽量使用绝对目录

6.5、ADD 和 COPY关键词

把本地的一些文件添加到镜像中,ADD 不仅能拷贝文件还有解压缩功能,COPY只可以拷贝

  1. ADD hello / #把当前目录的hello文件添加到镜像的根目录
  2. ADD test.tar.gz / #添加到根目录并解压缩
  3. WORKDIR /root
  4. ADD ahello test/ # 此时ahello的目录应该是/root/test/ahello
  5. WORKDIR /root
  6. COPY bhello test/

最佳实践:大部分COPY优先ADD使用,添加远程的文件或者目录请使用RUN curl或者RUN wget

6.6、 ENV关键词

设置环境常量

  1. ENV MYSQL_VERSION 5.6 #设置常量
  2. RUN apt-get install -y mysql-server= "${MYSQL_VERSION}"\
  3. && rm -rf /var/lib/apt/lists/* #引用常量

最佳实践:尽量使用,增加可维护性

6.7 、VOLUME 和 EXPOSE关键词

存储和网络

6.8、CMD 和 ENTRYPOINT还有RUN

RUN:执行命令并创建新的镜像层

CMD:设置容器启动后默认执行的命令和参数

ENTRYPOINT:设置容器启动时运行的命令

两种格式可以混合,一行用shell格式,一行用Exec格式

CMD命令执行细节:

容器启动时默认执行的命令

如果docker run指定了其他命令,CMD命令会被忽略

如果定义了多个CMD,只有最后一个会执行

假如有这样一个Dockerfile

  1. FROM centos
  2. ENV name Dockeraaaaaaa
  3. CMD echo "hello world"
  4. CMD echo "hello $name"

现在两种方式启动容器:

docker run [image id] #输出 hello Dockeraaaaaaa

docker run -it [image id] /bin/bash #不会输出 hello Dockeraaaaaaa,原因是docker run命令指定了启动后的命令,CMD就会被忽略

ENTRYPOINT 命令执行细节

让容器以应用程序或者服务器的形式运行

不会被忽略,一定会执行

最佳实践:写一个shell脚本作为entrypoint,让容器启动后执行该shell脚本

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注