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端口,直接出现
- 现在,假设我们非常不喜欢这个欢迎页面,我们希望改成欢迎 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
就是指定 基础镜像,因此一个 Dockerfile
中 FROM
是必备的指令,并且必须是第一条指令。
- 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 这里:左边是映射到主机端口 右边是默认端口
$ 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 tag
将ubuntu: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、创建仓库
创建一个私有仓库的方法: 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、连接仓库
$ 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
此时访问本地 5000
端口,每次刷新页面,计数就会加 1。
运行容器之后,如果想进入容器使用以下命令
$ 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
作者@发胖的向日葵