Docker仓库
仓库(Repository)是集中存放镜像的地方。
目前 Docker 官方维护了一个公共仓库 Docker Hub。 大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。 登录需要输入用户名和密码,登录成功后,我们就可以从 docker hub 上拉取自己账号下的全部镜像。
登录
wuyou@ubuntu :~$ docker login
登出
wuyou@ubuntu :~$ docker logout
拉取镜像
#查询镜像
wuyou@ubuntu :~$ docker search ubuntu
#拉取镜像
wuyou@ubuntu :~$ docker pull ubuntu
推送镜像
用户登录后,可以通过 docker push 命令将自己的镜像推送到 Docker Hub。
wuyou@ubuntu :~$ docker login
wuyou@ubuntu :~$ docker tag hello-world:latest 账户名称/hello:v1.0
wuyou@ubuntu :~$ docker images
wuyou@ubuntu :~$ docker push 账户名称/hello:v1.0
wuyou@ubuntu :~$ docker search 账户名称/hello
停止所有镜像
docker stop $(docker ps -a -q)
删除所有镜像
docker rm $(docker ps -a -q)
启动进入容器
docker run -it ubuntu /bin/bash
运行日志
wuyou@ubuntu:~$ docker logs clever_johnson
容器详细信息
docker inspect [容器id|镜像id
示例一:
wuyou@ubuntu :~$ docker inspect c9d12ce939a0
查看容器端口信息
docker port <container_id> 示例: wuyou@ubuntu :~$ docker port c9d12ce939a0
映射
随机映射
wuyou@ubuntu :~$ docker run -d -P nginx
指定端口映射
wuyou@ubuntu :~$ docker run -d -p 10086:80 nginx
查看映射端口信息
wuyou@ubuntu :~$ docker port 名称
host模式
wuyou@ubuntu :~$ docker run -d --network host nginx
浏览器测试
http://本机ip
Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
第一个示例 Dockerfile
# FROM:定制的镜像都是基于 FROM 的镜像
FROM ubuntu
# 镜像作者
MAINTAINER wuyou wuyou@ubuntu.cn
# RUN:用于执行后面跟着的命令行命令。
RUN apt-get update
RUN apt-get install -y gcc
ENTRYPOINT ["gcc"]
测试
wuyou@ubuntu:~/share/02dockfile$ docker build -t my_gcc .
workdir
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。 docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录 才会一直存在。
格式:
WORKDIR <工作目录路径>
from ubuntu:latest
maintainer wuyou wuyou@ubuntu.cn
workdir /a
run touch a.txt
workdir b
run touch 2.txt
构建生成镜像
test: 镜像的名字
wuyou@ubuntu:~/share/03dockfile$ docker build -t test:v1.0 .
查看构建的镜像
docker images
run
RUN:用于执行后面跟着的命令行命令。有以下俩种格式:
# RUN命令的格式
shell格式
RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。
exec格式
RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
copy
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。 格式:
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
#参数描述
[--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。
<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的
filepath.Match 规则。
<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
示例:
COPY hom* /mydir/
COPY hom?.txt /mydir/
Dockerfile
from ubuntu:latest
maintainer wuyou wuyou@ubuntu.cn
copy hello.txt /data/
docker build -t mytest:v1.1 .
//启动进入容器
docker run -it mytest:v1.1 /bin/bash
add
ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如 下:
- ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,
会自动复制并解压到 <目标路径>。 - ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会
令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
Dockerfile
from ubuntu:latest
maintainer wuyou wuyou@ubuntu.cn
add test.tar.gz /data/
cmd命令
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
- CMD 在docker run 时运行。
- RUN 是在 docker build。
**作用:**为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可 被 docker run 命令行参数中指定要运行的程序所覆盖。 **注意:**如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
格式:
CMD <shell 命令> CMD [“<可执行文件或命令>”,“”,“”,…] CMD [“”,“”,…] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
entrypoint
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖ENTRYPOINT 指令指定的程序。 优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。 注意: 如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
格式:
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,
以下示例:
FROM nginx ENTRYPOINT [“nginx”, “-c”] # 定参 CMD [“/etc/nginx/nginx.conf”] # 变参
不传参运行
$ docker run nginx:test
#容器内会默认运行以下命令,启动主进程。
#nginx -c /etc/nginx/nginx.conf
传参运行
docker run nginx:test -c /etc/nginx/new.conf
#容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)
#nginx -c /etc/nginx/new.conf
expose
声明端口。 作用:
- 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
- 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
格式:
EXPOSE <端口1> [<端口2>…]
容器中运行程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <errno.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
int listen_sock = socket(AF_INET, SOCK_STREAM, 0);
if (0 <= listen_sock)
{
struct sockaddr_in stServerAddr;
stServerAddr.sin_family = AF_INET;
stServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
stServerAddr.sin_port = htons(55555);
if ((0 == bind(listen_sock, (struct sockaddr *)&stServerAddr,
sizeof(stServerAddr))) &&
(0 == listen(listen_sock, 10)))
{
struct sockaddr_in stClientAddr;
socklen_t AddrLen = sizeof(stClientAddr);
int data_sock = -1;
while (0 <= (data_sock = accept(listen_sock, (struct sockaddr
*)&stClientAddr, &AddrLen)))
{
char szBuff[256];
int recv_len = 0;
while (0 < (recv_len = recv(data_sock, szBuff,
sizeof(szBuff), 0)))
{
send(data_sock, szBuff, recv_len, 0);
}
close(data_sock);
}
}
else
{
perror("bind:");
}
}
else
{
perror("create listen socket:");
}
return -1;
}
编译程序
wuyou@ubuntu:~/share/06echo$ gcc test.c -o myecho
第一种方式: Dockerfile
from ubuntu:latest
maintainer wuyou wuyou@ubuntu.cn
copy myecho /
expose 55555
#启动容器的时候执行myecho 必须使用相对路径
cmd ./myecho
wuyou@buuntu:~/share/06echo$ docker build -t mytest:v1.4 .
docker run mytest:v1.4
查看IP和测试
docker inspect crazy_chatelet 使用nc测试 nc 172.17.0.7 55555
退出docker
docker kill crazy_chatelet
第二种方式:
Dockerfile
from ubuntu:latest
maintainer wuyou wuyou@ubuntu.cn
copy myecho /
expose 55555
#启动容器的时候执行myecho
entrypoint ./myecho
//执行
docker build -t mytest:v1.5 . 运行 docker run -P mytest:v1.5 测试
nc localhost 端口
附录
docker官网:http://www.docker.com
Docker windows入门:https://docs.docker.com/windows/ Docker Linux 入门:https://docs.docker.com/linux/ Docker mac 入门:https://docs.docker.com/mac/ Docker 用户指引:https://docs.docker.com/engine/userguide/ Docker 官方博客:http://blog.docker.com/ Docker Hub: https://hub.docker.com/ Docker开源:https://www.docker.com/open-source
Docker中文资源:
Docker中文网站:http://www.docker.org.cn Docker入门教程: http://www.docker.org.cn/book/docker.html Docker安装手册:http://www.docker.org.cn/book/install.html 一小时Docker教程 :https://blog.csphere.cn/archives/22 Docker纸质书:http://www.docker.org.cn/dockershuji.html DockerPPT:http://www.docker.org.cn/dockerppt.html
|