docker学习笔记(供学习)

1、docker的基本概念

  • 镜像
  • 容器
  • 仓库

2、docker安装

卸载旧版本

旧版本的 Docker 称为 docker 或者 docker-engine,使用以下命令卸载旧版本:

$ sudo yum remove docker \                  
 docker-client \                  
 docker-client-latest \                  
 docker-common \                  
 docker-latest \                  
 docker-latest-logrotate \                  
 docker-logrotate \                  
 docker-selinux \                 
 docker-engine-selinux \                 
 docker-engine

使用 yum 安装

  • 更新yum源
$ cd /ect/yum.repos.d
$ mv CentOS-Base.repo CentOS-Base.repo.bak
$wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
$ yum update -y

PS:这里真是血的教训,如果centos的yum源版本太低,要更新,否则你安装的docker也会有问题

  • 执行以下命令安装依赖包:
$ sudo yum install -y yum-utils \           
device-mapper-persistent-data \           
lvm2
  • 执行下面的命令添加 yum 软件源:
$ sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#$ sudo sed -i 's/download.docker.com/mirrors.ustc.edu.cn\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

安装 Docker CE

方法1、更新 yum 软件源缓存,并安装 docker-ce

$ sudo yum makecache fast
$ sudo yum install docker-ce

方法2、使用脚本自动安装

在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS 系统上可以使用这套脚本安装,另外可以通过 --mirror 选项使用国内源进行安装:

$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun

启动 Docker CE

$ sudo systemctl enable docker
$ sudo systemctl start docker
其他指令
$ sudo systemctl status docker
$ sudo systemctl stop docker

可以使用 ps aux|grep docker查看docker进程

==PS:如果docker版本过低,可能会导致你后面再容器里面出现目录无权限,真的是苦恼。反正我试过17版本的docker是有问题的==

  • 目前我的版本是
$ docker -v
Docker version 19.03.12, build 48a66213fe

建立 docker 用户组

默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。

建立 docker 组:

$ sudo groupadd docker

将当前用户加入 docker 组:

$ sudo usermod -aG docker $USER

退出当前终端并重新登录,进行如下测试。

  • 测试 Docker 是否安装正确
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
Digest: sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

输出以上内容,说明docker安装完毕!

镜像加速

国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。国内很多云服务商都提供了国内加速器服务

  • 修改镜像源

对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

{  
  "registry-mirrors": [    
     "https://hub-mirror.c.163.com"  
  ]
}
  • 之后重新启动服务。
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
  • 检查加速器是否生效

执行 $ docker info,如果从结果中看到了如下内容,说明配置成功。

 复制代码Registry Mirrors: https://hub-mirror.c.163.com/

开启 Docker CLI 的实验特性

  • 编辑 ~/.docker/config.json 文件,新增如下条目

要用sudo命令

{  
  "experimental": "enabled"
}
  • 开启 Dockerd 的实验特性

编辑 /etc/docker/daemon.json,新增如下条目

{  
  "experimental": true
}

获取镜像、运行容器

$ docker pull 用户名/软件名:版本
$ docker pull ubuntu:18.04
$ docker image ls   #列出镜像
$ docker run -it  -rm  ubuntu:18.04  bash  #运行容器

docker run 就是运行容器的命令,具体格式我们会在 容器 一节进行详细讲解,我们这里简要的说明一下上面用到的参数。

  • -it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
  • --rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
  • ubuntu:18.04:这是指用 ubuntu:18.04 镜像为基础来启动容器。
  • bash:放在镜像名后的是 命令,这里我们希望有个交互式 Shell,因此用的是 bash

进入ubuntu容器后可以输入命令cat /etc/os-release查看当前系统版本

查看镜像、容器、数据卷所占用的空间

$ docker system df
#显示如下

TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 3 1 196.3MB 196.3MB (99%)
Containers 1 0 0B 0B
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B

  • 虚悬镜像
$ docker image ls -f dangling=true
  • 删除虚悬镜像
$ docker image prune
  • 中间层镜像查看(查看到的都是些镜像的依赖)
$ docker image ls -a
  • 获取所有镜像id
$ docker image ls -q

删除本地镜像

$ docker image rm [选项] <镜像1> [<镜像2> ...]
  • 长id删除镜像
$ docker image rm 完整的id
  • 短id删除镜像
$ docker image rm id的前三位数字
  • 镜像名删除
$ docker image rm nginx:版本号
  • 用 docker image ls 命令来配合删除
$ docker image rm $(docker image ls -q redis)

其中docker image ls -q redis 查出来是一个id号

3、docker 学习

利用commit 理解镜像构成

$ docker run --name webserver -d -p 80:80 nginx
  • 这条命令会用 nginx 镜像启动一个容器,命名为 webserver,并且映射了 80 端口,这样我们可以用浏览器去访问这个 nginx 服务器。

运行之后可以访问80端口,直接出现

1592638774720.png
  • 现在,假设我们非常不喜欢这个欢迎页面,我们希望改成欢迎 Docker 的文字,我们可以使用 docker exec 命令进入容器,修改其内容。
$ docker exec -it server bash
root@3729b97e8226:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
root@3729b97e8226:/# exit
exit

我们以交互式终端方式进入 webserver 容器,并执行了 bash 命令,也就是获得一个可操作的 Shell。

然后,我们用 <h1>Hello, Docker!</h1> 覆盖了 /usr/share/nginx/html/index.html 的内容。

现在我们再刷新浏览器的话,会发现内容被改变了。

  • 我们修改了容器的文件,也就是改动了容器的存储层。我们可以通过 docker diff 命令看到具体的改动。
$ docker diff server 
#显示如下
C /run
A /run/nginx.pid
C /root
A /root/.bash_history
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
C /usr
C /usr/share
C /usr/share/nginx
C /usr/share/nginx/html
C /usr/share/nginx/html/index.html
C /etc
C /etc/nginx
C /etc/nginx/conf.d
C /etc/nginx/conf.d/default.conf

现在我们定制好了变化,我们希望能将其保存下来形成镜像。

要知道,当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。

  • commit的语法为
$ docker commit --author "xue" --message "xue change the index.html today" server nginx:v2.6

其中 --author 是指定修改的作者,而 --message 则是记录本次修改的内容。这点和 git 版本控制相似,不过这里这些信息可以省略留空。server是容器的名字,nginx是镜像名,:后面的是Tag。我们可以在 docker image ls 中看到这个新定制的镜像

REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v2.6 2c6cfdb01afb About a minute ago 132MB
ubuntu 18.04 8e4ce0a6ce69 3 days ago 64.2MB
nginx latest 2622e6cca7eb 10 days ago 132MB
hello-world latest bf756fb1ae65 5 months ago 13.3kB

  • 使用 docker history
$ docker history nginx:v2.6

可以查看到我们提交的那一层

IMAGE CREATED CREATED BY SIZE COMMENT
2c6cfdb01afb 5 minutes ago nginx -g daemon off; 1.25kB xue change the index.html today
2622e6cca7eb 10 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B

ps:慎用docker commit ,只是为了帮助理解镜像的构成和分层存储的概念

使用Dockerfile定制镜像

#在一个空目录下新建文件夹
$ mkdir mynginx
$ cd mynginx
#新建Dockerfile文件
$ touch Dockerfile

Dockerfile文件内容如下:

FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
  • FROM 指定基础镜像

所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指定的。而 FROM 就是指定 基础镜像,因此一个 DockerfileFROM 是必备的指令,并且必须是第一条指令。

  • RUN 执行命令

RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。其格式有两种:

1、shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。

RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

2、exec 格式:RUN ["可执行文件", "参数1", "参数2"],这更像是函数调用中的格式。

构建镜像

Dockerfile 文件所在目录执行:

$ docker build -t nginx:v3 .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM nginx
 ---> 2622e6cca7eb
Step 2/2 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
 ---> Running in fe12239024b7
Removing intermediate container fe12239024b7
 ---> 0b3563cb1ca1
Successfully built 0b3563cb1ca1
Successfully tagged nginx:v3

这里我们使用了 docker build 命令进行镜像构建。其格式为:

$ docker build [选项] <上下文路径/URL/->

ps: docker bulid -t nginx:v3 . 中的.是指上下文的意思

4、操作容器

启动

启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。

  • 启动一个容器并且输出“Hello World”之后终止容器
$ docker run ubuntu:18.04 echo 'Hello World'
  • 启动一个 bash 终端,允许用户进行交互。
$ docker run -it  ubuntu:18.04 bash
#出现下面可以交互的伪终端
root@77049ca3ad59:/# pwd
/

其中,-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开。

使用docker container ls查看当前启动的容器输出如下:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77049ca3ad59 ubuntu:18.04 "bash" 4 minutes ago Up 4 minutes dreamy_grothendieck

当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

后台运行(守护态运行)

更多的时候,需要让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 -d 参数来实现。

  • 下面例子不加-d,执行完直接输出到宿主机上
$ docker run ubuntu:18.04 sh -c "while true; do echo hello world; sleep 1; done"
##
hello world
hello world
hello world
hello world
hello world
hello world
  • 加上-d参数
$ docker run -d ubuntu:18.04 sh -c "while true; do echo hello world; sleep 1; done"
e8ff38cce9dc2ba4cb758502dd88fae480de248bb1c07be4ccc90507a19bfca0

使用 -d 参数启动后会返回一个唯一的 id,也可以通过 docker container ls 命令来查看容器信息

要获取容器的输出信息,可以通过 docker container logs 命令。

$ docker container logs [container ID or NAMES]
hello world
hello world
hello world

终止

可以使用 docker container stop 来终止一个运行中的容器。

  • 使用 ctrl+d终止当前容器

  • 使用exit退出当前容器

终止状态的容器可以用 docker container ls -a 命令看到

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
89490ea8d4d3 ubuntu:18.04 "bash" 5 minutes ago Exited (130) 5 minutes ago kind_banzai
e8ff38cce9dc ubuntu:18.04 "sh -c 'while true; …" 11 minutes ago Exited (0) About a minute ago affectionate_shannon
a7fb459a33b9 ubuntu:18.04 "bash" 11 minutes ago Exited (127) 5 minutes ago beautiful_dewdney
beda02a77088 ubuntu:18.04 "sh -c 'while true; …" 15 minutes ago Exited (0) 15 minutes ago awesome_goldberg
aa03830b0b3f ubuntu:18.04 "sh -c 'echo 1;'" 16 minutes ago Exited (0) 16 minutes ago

拿到了 CONTAINER ID 后可以使用docker container start -a CONTAINER ID启动已经关闭的容器

docker container restart 命令会将一个运行态的容器终止,然后再重新启动它

进入容器

启动容器之后,如果想要进入容器执行命令。推荐使用docker exec

$ docker exec -it containerID bash
#执行此命令会有伪终端的命令提示符

导出/导出容器

  • 导出容器
$ docker container ls
##
#CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
98f83fc01249        ubuntu:18.04        "/bin/bash"         15 minutes ago      Up 15 minutes                           amazing_germain
##
$ docker export 98f83fc01249 > unbuntu0630.tar
  • 导入容器快照

是将容器快照导入为镜像

$ cat unbuntu0630.tar | docker import - test/ubuntu:0630

*注:用户既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。*

删除容器

可以使用 docker container rm 来删除一个处于终止状态的容器。例如

$ docker container rm  容器id

如果要删除一个运行中的容器,可以添加 -f 参数。Docker 会发送 SIGKILL 信号给容器。

  • 清理所有处于终止状态的容器

docker container ls -a 命令可以查看所有已经创建的包括终止状态的容器,如果数量太多要一个个删除可能会很麻烦,用下面的命令可以清理掉所有处于终止状态的容器。

$ docker container prune

5、docker仓库

Docker Hub操作

Docker Hub官方: https://hub.docker.com

1、登录/退出

$ docker login

Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: 账号
Password: 
WARNING! Your password will be stored unencrypted in /home/xue/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
#登录成功
$ docker logout
Removing login credentials for https://index.docker.io/v1/
#退出登录

2、查找镜像

$ docker search 镜像名

3、拉取镜像

$ docker pull  用户名/软件名:版本

4、推送镜像

用户也可以在登录后通过 docker push 命令来将自己的镜像推送到 Docker Hub。

以下命令中的 username 请替换为你的 Docker 账号用户名。

$ docker tag ubuntu:18.04 username/ubuntu:18.04

私有仓库

docker-registry 是官方提供的工具,可以用于构建私有的镜像仓库。本文内容基于 docker-registry v2.x 版本。

1、安装运行docker-registry

这将使用官方的 registry 镜像来启动私有仓库。默认情况下,仓库会被创建在容器的 /var/lib/registry 目录下。你可以通过 -v 参数来将镜像文件存放在本地的指定路径。例如下面的例子将上传的镜像放到本地的 /opt/data/registry 目录。

$ docker run -d \    
-p 5000:5000 \    
-v /opt/data/registry:/var/lib/registry \ 
--restart=always --name registry
registry
186bded94f4e00177428231596f285c4f437f08059a8263adea4aa237babbd75

#--restart=always --name registry 一定要有这一句,不然仓库要创建完后在手动开启。如果忘记开启就会导致推送不成功--|| 我就是这样
  • -d指在后台运行;

  • -v 指定私有仓库路径;

  • -p指定映射端口

  • --restart=always:仓库要保持开启状态

注:-p 这里:左边是映射到主机端口 右边是默认端口

2.png
$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
186bded94f4e        registry            "/entrypoint.sh /etc…"   22 seconds ago      Up 19 seconds       0.0.0.0:5000->5000/tcp   registry

确认容器已开启!

2、在私有仓库上传、搜索、下载镜像

  • 使用docker tag 标记要上传到私有仓库的镜像

    使用 docker tagubuntu:18.04 这个镜像标记为 10.10.10.42/ubuntu:18.04

    格式为 docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]

$ docker image ls 
$ docker tag ubuntu:18.04 10.10.10.42/ubuntu:18.04
  • 使用docker push上传镜像到本地仓库
$ docker push 10.10.10.42:5000/ubuntu:18.04
The push refers to repository [10.10.10.42:5000/ubuntu]
ddc500d84994: Pushed 
c64c52ea2c16: Pushed 
5930c9e5703f: Pushed 
b187ff70b2e4: Pushed 
18.04: digest: sha256:c32bd2e76e7688eeb1bb39754fff7cdfc571626fc1abfded4f82a90de79f8d10 size: 1152

  • curl 查看仓库中的镜像。
 $ curl 127.0.0.1:5000/v2/_catalog
 {"repositories":["ubuntu"]}

3、注意事项

如果你不想使用 127.0.0.1:5000 作为仓库地址,比如想让本网段的其他主机也能把镜像推送到私有仓库。你就得把例如 10.10.10.42:5000 这样的内网地址作为私有仓库地址,这时你会发现无法成功推送镜像。

这是因为 Docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制,或者查看下一节配置能够通过 HTTPS 访问的私有仓库。

  • Ubuntu 16.04+, Debian 8+, centos 7

对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com"
  ],
  "experimental":true,
  "insecure-registries":[
    "10.10.10.42:5000"
  ]
}

注意:该文件必须符合 json 规范,否则 Docker 将不能启动。

systemctl restart docker重启!

Nexus3.x私有仓库

使用 Docker 官方的 Registry 创建的仓库面临一些维护问题。比如某些镜像删除以后空间默认是不会回收的,需要一些命令去回收空间然后重启 Registry 程序。在企业中把内部的一些工具包放入 Nexus 中是比较常见的做法,最新版本 Nexus3.x 全面支持 Docker 的私有镜像。所以使用 Nexus3.x 一个软件来管理 Docker , Maven , Yum , PyPI 等是一个明智的选择。

1、启动Nexus 容器

$ docker run -d --name nexus3 --restart=always \
    -p 8081:8081 \
    -p 8899:8899 \
    --mount src=nexus-data,target=/nexus-data \
    sonatype/nexus3
    
Unable to find image 'sonatype/nexus3:latest' locally
latest: Pulling from sonatype/nexus3
78afc5364ad2: Pull complete 
58e1deb9693d: Pull complete 
77b60dc98dd9: Pull complete 
1646c0c7a5bf: Pull complete 
Digest: sha256:3262783b5f44c6265cf867b390e84a643b855873b2018c0d28037d7cd29a89cf
Status: Downloaded newer image for sonatype/nexus3:latest
a987923a16182c879931fc498a5ca002a22181dfc627337e9d474f52184eb8c7
成功!

注:这里的 8801 是Nexus启动的默认端口,8899端口是登录Nexus后新建仓库给仓库配置的端口。如果没有再开启8899这个端口,将不能登录到Nexus的仓库中进行上传和下载镜像的。

等待 3-5 分钟,如果 nexus3 容器没有异常退出,那么你可以使用浏览器打开 http://YourIP:8081 访问 Nexus 了。

第一次启动 Nexus 的默认帐号是 admin 密码是 admin123 登录以后点击页面上方的齿轮按钮进行设置。

2 、查看Nexus默认密码

$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
a987923a1618        sonatype/nexus3     "sh -c ${SONATYPE_DI…"   12 minutes ago      Up 12 minutes       0.0.0.0:8081->8081/tcp   nexus3
186bded94f4e        registry            "/entrypoint.sh /etc…"   3 hours ago         Up 3 hours          0.0.0.0:5000->5000/tcp   registry

找到Nexus的ID,开启终端进入容器

$ docker exec -it a987923a1618 bash
bash-4.4$ cat /nexus-data/admin.password 
ddef4fcf-26a2-4917-b230-b7c1f21a6899
bash-4.4$ 
3.png

3、创建仓库

创建一个私有仓库的方法: Repository->Repositories 点击右边菜单 Create repository 选择 docker (hosted)

  • Name: 仓库的名称
  • HTTP: 仓库单独的访问端口
  • Enable Docker V1 API: 如果需要同时支持 V1 版本请勾选此项(不建议勾选)。
  • Hosted -> Deployment pollcy: 请选择 Allow redeploy 否则无法上传 Docker 镜像。

其它的仓库创建方法请各位自己摸索,还可以创建一个 docker (proxy) 类型的仓库链接到 DockerHub 上。再创建一个 docker (group) 类型的仓库把刚才的 hosted 与 proxy 添加在一起。主机在访问的时候默认下载私有仓库中的镜像,如果没有将链接到 DockerHub 中下载并缓存到 Nexus 中。

4.png
[图片上传中...(6.png-e71f14-1598343900741-0)]
6.png

4、连接仓库

$ docker login 10.10.10.42:8899
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /home/xue/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

成功!

  • 标记镜像
$ docker tag ubuntu:18.04 10.10.10.42:8899/ubuntu:18.04
  • 推送镜像
$ docker push 10.10.10.42:8899/ubuntu:18.04
The push refers to repository [10.10.10.42:8899/ubuntu]
ddc500d84994: Pushed 
c64c52ea2c16: Pushed 
5930c9e5703f: Pushed 
b187ff70b2e4: Pushed 
18.04: digest: sha256:c32bd2e76e7688eeb1bb39754fff7cdfc571626fc1abfded4f82a90de79f8d10 size: 1152
  • 获取Nexus上的镜像
#删除本地镜像
$ docker image rm 10.10.10.42:8899/ubuntu
#再拉取
$ docker pull 10.10.10.42:8899/ubuntu:18.04 
18.04: Pulling from ubuntu
Digest: sha256:c32bd2e76e7688eeb1bb39754fff7cdfc571626fc1abfded4f82a90de79f8d10
Status: Downloaded newer image for 10.10.10.42:8899/ubuntu:18.04
10.10.10.42:8899/ubuntu:18.04

6、Docker Compose

tips:arch查看主机系统架构

安装与卸载

#使用pip安装
#安装python-pip
$ yum -y install epel-release
$ yum -y install python-pip
$ pip install --upgrade pip
$ sudo pip install -U docker-compose

安装成功后使用命令查看版本号

$ docker-compose -v
docker-compose version 1.26.2, build unknown
#安装成功!

卸载

如果是二进制包方式安装的,删除二进制文件即可。

$ sudo pip uninstall docker-compose

不推荐二进制包下载,是在太坑了,下了半天没成功过一次!

使用docker-compose .yml

首先介绍几个术语。

  • 服务 (service):一个应用容器,实际上可以运行多个相同镜像的实例。
  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元。

可见,一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理。

场景

最常见的项目是 web 网站,该项目应该包含 web 应用和缓存。

下面我们用 Python 来建立一个能够记录页面访问次数的 web 网站。

web 应用

在一个空目录下新建文件夹,在该目录中编写 app.py 文件

from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
    count = redis.incr('hits')
    return 'Hello World! 该页面已被访问 {} 次。\n'.format(count)
if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

Dockerfile

编写 Dockerfile 文件,内容为

FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
CMD ["python", "app.py"]

docker-compose.yml

编写 docker-compose.yml 文件,这个是 Compose 使用的主模板文件。

version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpiney

运行 docker-compose 项目

$ docker-compose up
7.png

此时访问本地 5000 端口,每次刷新页面,计数就会加 1。

8.png
9.png

运行容器之后,如果想进入容器使用以下命令

$ docker container ls 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                            NAMES
74e22b7ad8b0        web_web             "python app.py"          24 hours ago        Up 36 seconds       0.0.0.0:5000->5000/tcp                           web_web_1
09ddb170b068        redis:alpine        "docker-entrypoint.s…"   24 hours ago        Up 35 seconds       6379/tcp                                         web_redis_1
#拿到容器id74e22b7ad8b0  
$ docker exec -it 74e22b7ad8b0 sh
/code # pwd
/code
/code # 

compose 模板文件

模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多。但这里面大部分指令跟 docker run 相关参数的含义都是类似的。

默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式。

docker run -v /www/hyperf:/hyperf-skeleton --name hyperf_test -p 9501:9501 -it --entrypoint /bin/sh hyperf/hyperf:7.2-alpine-v3.9-cli

作者@发胖的向日葵

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350