Docker组成:Docker client 和 Docker Server
Docker 组件:镜像(image),容器(container),仓库(repository)
搜索镜像:docker search
获取镜像:docker pull
查看镜像:docker images
删除镜像:docker rmi
[root@localhost ~]# docker search centos ## 它会去docker Hub 上搜索镜像
[root@localhost ~]#rz -y 选择 centos.tar镜像包
[root@localhost ~]# docker load --input centos.tar #导入镜像
docker load --input centos.tar 或 docker load < centos.tar
[root@localhost ~]# docker images #查看本地镜像
\REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest 970633036444 6 weeks ago 196.7MB
[root@localhost ~]#
[root@localhost ~]# docker pull centos #先拉取下来镜像包
[root@localhost ~]# docker save centos -o centos.tar #将上面的centos镜像保存成一个tar文件
[root@localhost ~]# docker run centos /bin/echo "Hello world" #起centos镜像,并输出内容。(centos 镜像名称必须在所有参数的最后)
Hello world
[root@localhost ~]# docker ps -a #查看所有容器
[root@localhost ~]# docker exec mydocker ps #exec是相当于不进入容器里面,而执行命令
PID TTY TIME CMD
30 ? 00:00:00 ps
[root@localhost ~]#
[root@localhost ~]# docker logs 9baa263c288a #查看当前访问的日志(只能查看最后一条)
[root@localhost ~]#
临时开一终端,实时查看当前访问的日志: docker logs -f mynginx
[root@localhost ~]# docker run -d -P nginx # -P 随机映射
[root@localhost ~]# docker run -d -p 192.168.132.147:81:80 --name mynginx nginx (nginx为镜像,80为容器的端口,192.168.132.147:81虚拟机的本地IP和端口)
[root@localhost ~]# docker port mynginx #查看映射
随机映射:docker run -P
指定映射:
-p hostPort: containerPort
-p ip:hostPort: containerPort
-p ip:: containerPort
-p hostPort: containerPort:udp
1,不指定虚拟机目录的挂载方式:
[root@localhost ~]# docker run -d --name nginx-volume-tests -v /data nginx
e57a78590a6fe47cdf145a39da56063d79612615af9d830b9ca95457c3b8450
(nginx-volume-tests为容器名,/data 表示将虚拟机的卷挂载到容器的data目录下,nginx为镜像)
接下来怎么查看虚拟机的哪个目录挂载到容器了呢???
[root@localhost ~]# docker inspect -f {{.Mounts}} nginx-volume-tests
[{volume 7f18e59432ee18028bee3f5a731d00510ff268029807c033193ddd5aee7aae3f /var/lib/docker/volumes/7f18e59432ee18028bee3f5a731d00510ff268029807c033193ddd5aee7aae3f/_data /data local true }]
[root@localhost ~]# docker inspect -f {{ .Mounts }} nginx-volume-tests
Template parsing error: template: :1: unexpected unclosed action in command
[root@localhost ~]#
2,指定虚拟机目录的挂载方式:
[root@localhost ~]#mkdir -p /data/docker-volume-nginx
[root@localhost ~]# docker run -d --name nginx-volume-test2 -v /data/docker-volume-nginx/:/data nginx
(将物理主机的/data/docker-volume-nginx挂载到容器的/data目录下)
[root@localhost ~]# mkdir /data/nfs-data -p
[root@localhost ~]# docker run -d --name nfs -v /data/nfs-data:/data centos
494c14f1cb3efc420244a4140f562952369482d904e67a63fe5d79986b0bcd01
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b51e0ea4b1a7 nginx "nginx -g 'daemon ..." 27 minutes ago Up 27 minutes 80/tcp nginx-volume-test2
e57a78590a6f nginx "nginx -g 'daemon ..." 56 minutes ago Up 56 minutes 80/tcp nginx-volume-tests
[root@localhost ~]#
(从上面可以看出容器没有运行起来,啥原因呢??是因为你没有让他执行命令)
[root@localhost ~]# docker run -d --name nfs2 -v /data/nfs-data:/data centos /bin/bash
f8fdd06b9db0dd4b00e3b6c7d6308c6566adbfa54cb99272bee93d0db146941a
[root@localhost ~]#
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b51e0ea4b1a7 nginx "nginx -g 'daemon ..." 31 minutes ago Up 31 minutes 80/tcp nginx-volume-test2
e57a78590a6f nginx "nginx -g 'daemon ..." 59 minutes ago Up 59 minutes 80/tcp nginx-volume-tests
[root@localhost ~]#
(再次执行加上命令了,为啥容器还是没有起来呢?是因为命令执行完了。你可以把centos换成nginx镜像容器就会一直运行)
3,数据卷容器:
其实就是多个容器间共享数据。就像NFS
[root@localhost ~]#mkdir /app/data
[root@localhost ~]# docker run -d --name nfs-volume1 -v /app/data:/tmp nginx
62b641f771c209010a56a85bb285546ed1bd667d0763473a2a88e16aaf032713
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
62b641f771c2 nginx "nginx -g 'daemon ..." 4 seconds ago Up 3 seconds 80/tcp nfs-volume1
b51e0ea4b1a7 nginx "nginx -g 'daemon ..." 40 minutes ago Up 40 minutes 80/tcp nginx-volume-test2
e57a78590a6f nginx "nginx -g 'daemon ..." About an hour ago Up About an hour 80/tcp nginx-volume-tests
[root@localhost ~]#
[root@localhost ~]# docker run --rm -it --volumes-from nfs-volume1 centos /bin/bash
[root@f9084a10432a /]#
然后再在当前的容器(f9084a10432a)创建文件,可以发现物理机/app/data/下会同样生成。
[root@localhost nginx]# cat Dockerfile
# This Dockerfile
# Base image
FROM centos
#在什么基础上创建
MAINTAINER liuqi 8523@qq.com
#谁创建的,维护者是谁
RUN rpm -ivh http://download.fedoraproject.org/pub/epel/7/ppc64le/Packages/e/epel-release-7-11.noarch.rpm
RUN yum install -y nginx && yum clean all
RUN echo "daemon off;" >>/etc/nginx/nginx.conf
ADD index.html /usr/share/nginx/html/index.html
#那么在当前目录下就需要先准备好index.html 文件
#你可以写命令,干了什么
EXPOSE 80
CMD ["nginx"]
[root@localhost nginx]#
[root@localhost nginx]# echo "nginx in docker haha">>index.html
(在Dockerfile 的当前目录创建目录首页)
[root@localhost nginx]# docker build -t mynginx:v2 .
[root@localhost nginx]# docker image pull library/hello-world
上面代码中,docker image pull是抓取 image 文件的命令。library/hello-world是 image 文件在仓库里面的位置,其中library是 image 文件所在的组,hello-world是 image 文件的名字。