DOCKER

1 linux环境安装

1
2
3
4
下载最新的官方docker的yum源
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo
可以通过yum list | grep docker 查看一下最新的版本
yum install -y docker-ce

2 镜像打标签 docker tag 镜像 xxx

1
2
3
4
5
chenghaodeMacBook-Pro:~ chenghao$ docker tag ubuntu ubuntu_test
chenghaodeMacBook-Pro:~ chenghao$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 2ca708c1c9cc 3 weeks ago 64.2MB
ubuntu_test latest 2ca708c1c9cc 3 weeks ago 64.2MB

如果想修改TAG,则使用docker tag 镜像 xxx:xxx 的形式即可

1
2
3
4
5
6
chenghaodeMacBook-Pro:~ chenghao$ docker tag ubuntu ubuntu_test:test
chenghaodeMacBook-Pro:~ chenghao$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 2ca708c1c9cc 3 weeks ago 64.2MB
ubuntu_test latest 2ca708c1c9cc 3 weeks ago 64.2MB
ubuntu_test test 2ca708c1c9cc 3 weeks ago 64.2MB

3 打包新的镜像 docker commit -m “描述” -a “操作人员” CONTAINER ID 新的镜像名

1
2
docker commit -m "centos install net-tools" -a "chenghao" d56b7d590195  my_centos
sha256:9b8543bb78c7e8ef3a0b00b553bb5995ac39e99995be3a5c94968c2cf79649a8

4 导出镜像 docker save -o xx.tar 镜像

1
2
3
docker save -o my_centos_test.tar centos_with_net_tools
ls
my_centos_test.tar

5 导入镜像 docker load –input tar 名称 或者 docker load < xx.tar

1
2
3
docker load < my_centos_test.tar
1cf8055af1f2: Loading layer [==================================================>] 73.73MB/73.73MB
Loaded image: centos_with_net_tools:latest

6 删除容器 docker rm container_id (如果容器正在运行,加上-f)

1
2
3
4
docker rm -f my_centos
my_centos
docker  export  container_id  > file.tar  // 导出容器,可以迁移到其他机器上,需要导入
cat file.tar |docker import - aming_test   //这样会生成aming_test的镜像

7 镜像私有仓库

  1. 下载registry 镜像,我们可以用它来创建本地的docker私有仓库 docker pull registry (registry 服务器)
1
docker pull registry
  1. 启动容器,映射端口到宿主机 (registry 服务器)

    -p会把容器的端口映射到宿主机上,:左边为宿主机监听端口,:右边为容器监听端口

1
2
docker run -itd -p 5000:5000 --name my_registry registry
5a49aaf4b84a3eafc7dc77b1c6c69db816aab1b43d91b4176126378398189ed8
  1. 检查容器是否映射成功 (registry 服务器)
1
2
curl 127.0.0.1:5000/v2/_catalog
{"repositories":[]}
  1. 标记一下tag,必须要带有私有仓库的ip:port(另一个服务器)
1
2
3
4
docker tag centos_with_net_tools 192.168.31.232:5000/centos
chenghaodeMacBook-Pro:~ chenghao$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.31.232:5000/centos latest 9b8543bb78c7 3 hours ago 276MB
  1. 推送镜像到私有仓库 (另一个服务器)
1
2
3
docker push 192.168.31.232:5000/centos
The push refers to repository [192.168.31.232:5000/centos]
Get https://192.168.31.232:5000/v2/: http: server gave HTTP response to HTTPS client

warn:发现推送镜像失败,需要添加仓库路径后重新推送,需要https的方法才能上传,我们可以修改下daemon.json来解决, vim /etc/docker/daemon.json (docker重启后,注意重新启动registry容器)

1
2
3
4
{
"registry-mirrors": [ "https://registry.docker-cn.com"],
"insecure-registries": [ "192.168.31.232:5000"]
}

重新在尝试推送一次

1
2
3
4
5
docker push 192.168.31.232:5000/centos
The push refers to repository [192.168.31.232:5000/centos]
1cf8055af1f2: Pushed
877b494a9f30: Pushed
latest: digest: sha256:33d629cba22f24ad8f43ada6b72f2b1905a3365a3341fcbd6cb7469834658d49
  1. 重新检查registry 服务器,可以发现镜像已经推送成功,这样在其它主机配置相同到仓库地址就可以拉取到镜像了
1
2
curl 127.0.0.1:5000/v2/_catalog
{"repositories":["centos"]}

8 数据管理

  1. 挂载本地的目录到容器里 -v 用来指定挂载目录 :前面的/data/为宿主机本地目录,:后面的/data/为容器里的目录,会在容器中自动创建
1
2
docker run -itd --name my_centos -v /usr/local/data/:/usr/local/data centos bash
7261513862ef9a43b59725cef76b7c10df53fe002dc8dcff701b53926ba60426
  1. 在宿主机新建目录,查看容器目录是否能够同步
1
2
3
4
chenghaodeMacBook-Pro:data chenghao$mkdir test
进入容器
[root@7261513862ef data]# ll
drwxr-xr-x 2 root root 64 Oct 13 15:06 test
  1. 挂载数据卷 新建一个容器,挂载到上面创建的my_centos容器 (注意–volumes-from 中间不能空格)
1
2
docker run -itd --volumes-from my_centos --name=centos_test centos bash
ad40fc78083e0e5e8a84eb20597b03145de7d6fe66e238cdad8d52dae4e9c85d
  1. 以后如果我们需要多个容器之间相互共享数据,类似于linux里面的NFS,我们就可以搭建一个专门的数据卷 容器,然后其他容器直接挂载该数据卷。

9 DOCKERFILE构建镜像

  1. FROM //指定基于哪个基础镜像

    FROM centos

  2. MAINTAINER //指定作者信息

    MAINTAINER chenghao

  3. RUN //镜像操作指令

    格式为 RUN 或者 RUN [“executable”, “param1”, “param2”],比如
    RUN yum install httpd
    RUN [“/bin/bash”, “-c”, “echo hello”]

  4. CMD //用来指定容器启动时用到的命令,只能有一条
    格式为:CMD [“executable”, “param1”, “param2”]或 CMD command param1 param2 或 CMD [“param1”, “param2”]
    CMD [“/bin/bash”, “/usr/local/nginx/sbin/nginx”, “-c”, “/usr/local/nginx/conf/nginx.conf”]

  5. EXPOSE //映射出去的端口
    EXPOSE 22 80 8443

  6. ENV //为后续的RUN指令提供一个环境变量
    ENV PATH /usr/local/mysql/bin:$PATH

  7. COPY // 复制文件。 其基本格式:
    格式1:COPY <源路径>…<目标路径>
    格式2:COPY [“<源路径1>”,…..”<目标路径>“]

  8. ADD // 更高级的复制文件,在COPY的基础上增加了一些功能,如果复制的是压缩包的话,会直接解压,而不需要在使用RUN解压. 将本地的一个文件或目录拷贝到容器的某个目录里。 其中src为Dockerfile所在目录的相对路径,它也可以是一个url,会直接去下载,不需要通过RUN更加的方便。

  9. VOLUME //创建一个可以从本地主机或其他容器挂载的挂载点
    格式 VOLUME [“/data”]

  10. ENTRYPOINT // 容器启动时要执行的命令,它和CMD很像,也是只有一条生效,如果写多个只有最后一条有效。和CMD不同是:CMD 是可以被 docker run 指令覆盖的,而ENTRYPOINT不能覆盖

  11. USER //指定运行容器的用户
    格式 USER chenghao

  12. WORKDIR //为后续的RUN、CMD或者ENTRYPOINT指定工作目录
    格式 WORKDIR /path/to/workdir

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#来源于哪个镜像
FROM centos
# 作者信息
MAINTAINER chenghao javachenghao@163.com
# 安装相关的依赖
RUN yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-devel
# 下载nginx
ADD http://nginx.org/download/nginx-1.18.0.tar.gz .
# 解压nginx
RUN tar zxvf nginx-1.8.0.tar.gz
# 创建文件夹
RUN mkdir -p /usr/local/nginx
# 编译
RUN cd nginx-1.8.0 && ./configure --prefix=/usr/local/nginx && make && make install
# 打开端口
EXPOSE 80
# 容器启动后执行命令 tail 保证一直运行
ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /etc/passwd

创建镜像:
docker build -t centos_nginx .

1
2
3
4
5
6
7
8
9
10
Step 8/9 : EXPOSE 80
---> Running in d309fbba6478
Removing intermediate container d309fbba6478
---> e069703b2053
Step 9/9 : ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /etc/passwd
---> Running in ece236553641
Removing intermediate container ece236553641
---> 483bcf6d8150
Successfully built 483bcf6d8150
Successfully tagged nginx:latest

启动容器,检验状态 ,发现启动成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
docker run -itd -p 8080:80 483bcf6d8150 bash
871971b3df433772b452e20059f919f0a8c5a2c5d22ac3981fd33e71016405b0
chenghaodeMacBook-Pro:Documents chenghao$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
871971b3df43 483bcf6d8150 "/bin/sh -c '/usr/lo…" 4 seconds ago Up 3 seconds 0.0.0.0:8080->80/tcp serene_bartik
chenghaodeMacBook-Pro:Documents chenghao$ curl 127.0.0.1:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>

10 docker logs -f 容器 可以用来查看容器为啥启动不成功