docker构建镜像
2019-08-03 本文已影响0人
GUIN蚂蚁
这里假设你已经成功安装了docker,以下是贴子要做的事情:
- 构建docker镜像
- 建立docker私有仓库
1. 工程目录
.
├── docker
│ ├── Dockerfile
│ └── make_image.sh
└── main.go
工程目录简单一点,只是举个栗子
docker目录:docker相关文件
Dockerfile:帮助我们构建镜像的文件,里面会写一些执行命令
make_image.sh: 编译main.go文件,构建镜像,push镜像到docker仓库
main.go: 我们的app代码,最后运行在容器里面的程序
Dockerfile
FROM ubuntu
COPY . app/
CMD ["app/docker-test"]
第一行:制定基础镜像,即程序运行的环境
第二行:拷贝docker目录下的所有文件到镜像根目录的app目录下
第三行:容器启动成功后,执行的命令/程序
make_image.sh
#!/usr/bin/env bash
# enter root directory
cd ..
# init environment, to find command: go
source /etc/profile
# build app
go build -o docker-test
if [[ ! -f docker-test ]]; then
exit 1
fi
chmod +x docker-test
mv docker-test docker/
cd docker
version="0.0.1"
my_registry="my.registry:5000/docker_test:"${version}
# build the image
docker build --tag=docket_test:${version} .
# tag for image
docker tag docket_test:${version} ${my_registry}
# push the image to docker repository
docker push ${my_registry}
echo ${my_registry}
rm docker-test
- cd进工程目录,编译main文件。这里为什么要执行source呢?不知道为什么在执行这个make_image.sh脚本时,会一直提示:go command not found。
- go build之后,生成可执行文件,添加执行权限后,丢到docker目录下
- docker build,执行后该命令后,会根据Dockerfile生成镜像,docker_test是镜像的名字,version是版本号
- docker tag,为镜像打标签,my_registry是docker仓库地址,下面会再讲解
- docker push, 将镜像push到docker私有仓库
main.go
只打印一些简单的信息,要安装好go环境哈,没有的话写个shell脚本在上面跑也行
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("running on the docker")
for {
time.Sleep(time.Second * 2)
fmt.Println("sleep 2s on the docker")
}
}
2. 配置/etc/host
$ cat /etc/hosts
127.0.0.1 localhost
## your docker repository address
127.0.0.1 my.registry
- my.registry是私有仓的ip地址,我这里写本地ip,可以先在本地做私有仓库
3. 在私有仓库的服务器上安装docker registry
- pull docker的registry镜像,需要先安装docker
$ docker pull registry
- 运行registry镜像
docker run -d -p 5000:5000 -v /option/docker-registry:/var/lib/registry registry
- docker run:启动registry镜像,会生成一个容器。 example: docker run <image_name>
- d: 容器后台运行
- p: 将服务器5000端口号映射到registry容器的5000端口号
- v: 将本地目录/option/docker-registry挂载到容器的/var/lib/registry registry目录,后面的目录是registry容器存储镜像的地方,但容器挂了之后文件就会不在了,所有这里要挂载到本地目录
4. 配置/etc/docker/daemon.json
$ cat /etc/docker/daemon.json
{
"registry-mirrors": ["http://harbor.test.com"],
"insecure-registries": ["my.registry:5000"]
}
- registry-mirrors:开源的容器镜像仓库
- insecure-registries: 我们私有仓库的地址,my.registry是/etc/hosts配置的那个地址,5000是registry的端口号
5. 构建并push镜像
好了,到最后一步了,在docker目录执行make_image.sh脚本
$ cd docker
$ sudo ./make_image.sh
Sending build context to Docker daemon 2.006MB
Step 1/3 : FROM ubuntu
---> 3556258649b2
Step 2/3 : COPY . app/
---> Using cache
---> b0bce5a5a773
Step 3/3 : CMD ["app/docker-test"]
---> Using cache
---> 0f1bd3b8aea9
Successfully built 0f1bd3b8aea9
Successfully tagged docket_test:0.0.1
The push refers to repository [my.registry:5000/docker_test]
062151ee13df: Layer already exists
b079b3fa8d1b: Layer already exists
a31dbd3063d7: Layer already exists
c56e09e1bd18: Layer already exists
543791078bdb: Layer already exists
0.0.1: digest: sha256:55987343bb1c2a102d4ceab288f2f39a446fc67c1c1ae92e64ee16cafd1b6ddc size: 1363
my.registry:5000/docker_test:0.0.1
- 镜像已经构建成功,并已经push到docker私有仓库了
本地运行一下镜像,看效果
- 查看本地的镜像
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docket_test 0.0.1 0f1bd3b8aea9 About an hour ago 66.2MB
my.registry:5000/docker_test 0.0.1 0f1bd3b8aea9 About an hour ago 66.2MB
ubuntu latest 3556258649b2 10 days ago 64.2MB
hello-world latest fce289e99eb9 7 months ago 1.84kB
docket_test和my.registry:5000/docker_test, 都是我们生成的镜像,前者是本地的镜像,后者是push到docker仓库的镜像,但通过看IMAGE ID可以知道,它们是同一个东西。
- 启动镜像
注:镜像后面记得加tag
$ sudo docker run docket_test:0.0.1
running on the docker
sleep 2s on the docker
sleep 2s on the docker
sleep 2s on the docker
sleep 2s on the docker
sleep 2s on the docker
sleep 2s on the docker
- 以上这里信息就是容器启动后的main.go打印的信息
6. 查看docker私有仓库的镜像
- 查看所有的镜像
$ curl -XGET http://my.registry:5000/v2/_catalog
{"repositories":["docker_test"]}
- 查看制定镜像的所有tags
$ curl -XGET http://my.registry:5000/v2/docker_test/tags/list
{"name":"docker_test","tags":["0.0.1"]}
- 在docker私有仓库的服务器目录查看镜像
$ ls /option/docker-registry
该目录是启动docker registry时通过-v参数配置的
一键清除none镜像
$ sudo docker rmi -f `sudo docker images | grep "<none>" | awk '{print $3}'`