@aloxc
2019-05-02T22:19:04.000000Z
字数 7116
阅读 314
docker
特别注意,golang程序可能编译后会有问题,需要设置不使用cgoCGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main
镜像(image):就是一个只读的模板,类似于打包好的操作系统iso文件
容器(container):使用镜像启动的系统,类似我们安装好的win7
仓库(Repository):就是保存镜像的地方,官方仓库hub.docker.com
注册器(Registry):就是创建仓库的,分为公有和私有
一个Registry有多个仓库,一个仓库有若干个镜像,可以使用一个镜像创建若干个容器。
Ubuntu 16.04 安装 Docker
1.选择国内的云服务商,这里选择阿里云为例
curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
2.安装所需要的包
sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
3.添加使用 HTTPS 传输的软件包以及 CA 证书
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates
4.添加GPG密钥
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
5.添加软件源
echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo tee /etc/apt/sources.list.d/docker.list
6.添加成功后更新软件包缓存
sudo apt-get update
7.安装docker
sudo apt-get install docker-engine
8.启动 docker
sudo systemctl enable docker
sudo systemctl start docker
#启动docker
sudo systemctl enable docker
sudo systemctl start docker
#停止docker
sudo systemctl stop docker
新建或者编辑配置文件 /etc/docker/daemon.json
添加如下代码
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"]
}
保存退出后重启docker
sudo systemctl restart docker
#示例拉取mysql最后的版本latest
sudo docker pull mysql
#示例拉取mysql的5.6.43,注意5.6.43是tag
sudo docker pull mysql:5.6.43
sudo docker images
#使用镜像名称
sudo docker rmi mysql
#使用镜像的Image ID(只需要写出部分)
sudo docker rmi bb
#使用镜像名称和tag,中间使用冒号分割
sudo docker rmi mysql:5.6.43
如何确定一个镜像
1.使用tag
2.使用镜像名
3.使用镜像名和tag
导出镜像,当某的时候可能别的机器需要某个镜像,但是目标机器无法上网或者其他原因,我们可以把我们现有的镜像导出成一个压缩包,
#save命令,后面跟着镜像名称和tag然后 > 到保存镜像的目录和文件名称
sudo docker save nginx:latest >./nginx.dk
导入镜像
sudo docker load < ./nginx.dk
#参数说明,
# -it表示是使用交互方式
# --name后面跟着的是给即将启动的容器一个名字,名字和运行中的容器不能一样
# 接下来就是镜像名称和tag
# 最后的/bin/bash就是容器起来后要打开的命令行(容器中的命令行)
sudo docker run -it --name mycentos centos:latest /bin/bash
非交互方式启动
#参数说明
# -d是使用守护进程起来的容器
# --name后面跟着的是给即将启动的容器一个名字,名字和运行中的容器不能一样
sudo docker run -d --name mynginx nginx:latest
非交互方式启动容器后,如果想进入的话,可使用如下命令
sudo docker exec -it mynginx /bin/base
#如果报错,可使用如下试试
sudo docker exec -it mynginx /bin/sh
#使用容器的名称
sudo docker stop mynginx
#使用容器的容器id(一部分就可以了)
sudo docker stop bb
停止所有容器
sudo docker stop 'sudo docker ps -q'
sudo docker ps
该命令可选如下参数
删除容器
sudo docker rm 容器名称或者容器id
删除所有容器
sudo docker rm 'sudo docker ps -a -q'
sudo groupadd docker
sudo gpasswd -a ubuntu docker
sudo service docker restart
重新进入shell
sudo docker container ls
sudo docker pull tomcat
参数说明:
sudo docker run -d --name mytomcat -p 8888:8080 tomcat:latest
我们使用curl http://localhost:8888看看是否有输出,有就表明mytomcat这个容器已经运行了。
sudo docker cp docker.war mytomcat:/usr/local/tomcat/webapps/
curl http://localhost:8888/docker/
playground 一个练习的虚拟环境,有时间限制,地址:
https://labs.play-with-docker.com,使用docker.com账号登录
先编写一个程序,本例子使用golang
package main
import "fmt"
func main() {
fmt.Println("你好,docker!本例使用golang创建的可执行文件")
}
进到该程序的目录执行编译生成hellodocker
go build -o "hellodocker"
编写Dockerfile
vi Dockerfile
FROM scratch
ADD hellodocker /
CMD ["/hellodocker"]
保存
命令说明:
第一行表示新建一个base image
第二行是把我们编译生成的hellodocker放到image的根目录
第三行表示执行hellodocker程序
docker build -t aloxc/hellodocker .
命令说明,docker build 表示执行镜像制作,-t 指定tag,后面的aloxc是对应hub.docker.com里面的账户名称,hellodocker是镜像名称 ,.点好表示从当前目录找Dockerfile
docker images
可以看到我们刚制作好的镜像
#查看我们制作的image的分层,后面的参数是image id
docker history 5b6d6c39bd25
现在我们启动下该容器
docker run 5b6d6c39bd25
docker run -it centos
启动一个centos,进入交互界面,在容器中安装vim
yum install -y vim
exit
在宿主机执行下面命令,罗列出所有的容器
docker container ls -a
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多出的层
docker history centos
docker history aloxc/centos-vim
不推荐使用原来有的容器创建一个新的镜像
新建Dockerfile,vi Dockerfile
FROM centos
RUN yum install -y vim
执行生成镜像的命令
docker build -t aloxc/centos-vim2 .
命令说明:docker build 表示执行镜像制作,-t 指定tag,后面的aloxc是对应hub.docker.com里面的账户名称,centos-vim2是镜像名称 ,.点好表示从当前目录找Dockerfile
docker images
FROM scratch #制作一个base image
FROM centos #使用一个base image
FROM ubuntu:18.04 使用其它的image
最佳实践:尽量使用官方的进行作为base image
该关键词定义了一些镜像中的matadata,类似我们写程序中的代码注释,最佳实践:Metadata不可少,LABEL可以添加多个,如下
LABEL maintainer="abc@gmail.com"
LABEL version="1.0"
LABEL description="this is a description"
就是需要在制作镜像的时候可能需要安装一些软件或者其它命令,最佳实践:每一个RUN就会新生成一层,所有尽量多个命令写到一行,命令太长可使用反斜线换行
RUN yum update && yum install -y vim\
python-dev #反斜线换行
RUN apt-get update && apt-get install -y perl\
pwgen --no-install-recommends && rm -rf \
/var/lib/apt/lists/* #注意清理缓存
RUN /bin/bash -c 'source $HOME/.bashrc;echo $HOME'
设定当前工作目录,类似linux中的cd,
WORKDIR /test #如果没有test目录会自动创建test目录
WORKDIR demo #进入到test/demo
RUN pwd #输出结果应该是/test/demo
WORKDIR最佳实践:尽量使用WORKDIR,尽量不要使用RUN cd;尽量使用绝对目录
把本地的一些文件添加到镜像中,ADD 不仅能拷贝文件还有解压缩功能,COPY只可以拷贝
ADD hello / #把当前目录的hello文件添加到镜像的根目录
ADD test.tar.gz / #添加到根目录并解压缩
WORKDIR /root
ADD ahello test/ # 此时ahello的目录应该是/root/test/ahello
WORKDIR /root
COPY bhello test/
最佳实践:大部分COPY优先ADD使用,添加远程的文件或者目录请使用RUN curl或者RUN wget
设置环境常量
ENV MYSQL_VERSION 5.6 #设置常量
RUN apt-get install -y mysql-server= "${MYSQL_VERSION}"\
&& rm -rf /var/lib/apt/lists/* #引用常量
最佳实践:尽量使用,增加可维护性
存储和网络
RUN:执行命令并创建新的镜像层
CMD:设置容器启动后默认执行的命令和参数
ENTRYPOINT:设置容器启动时运行的命令
Shell格式和Exec格式
Shell格式:直接书写命令
RUN apt-get install -y nginx
CMD echo "hello docker"
ENTRYPOINT echo "hello docker 。。。"
Exec格式:使用中括号括起来,命令加参数
RUN ["apt-get","install","-y","vim"]
CMD ["/bin/echo","helo docker"]
ENTRYPOINT ["/bin/bash","-c","/bin/echo helo docker。。。"]
两种格式可以混合,一行用shell格式,一行用Exec格式
CMD命令执行细节:
容器启动时默认执行的命令
如果docker run指定了其他命令,CMD命令会被忽略
如果定义了多个CMD,只有最后一个会执行
假如有这样一个Dockerfile
FROM centos
ENV name Dockeraaaaaaa
CMD echo "hello world"
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脚本