一.容器管理
1.用本地镜像(类似于vm的iso文件)创建一个容器(类似vm虚拟机):
创建centos6的容器:
docker create -it centos6 bash #docker images中有centos6的镜像文件
我之前也写到过另一种创建容器的方式:
docker run -itd centos6 bash
这两种方式的区别在于:前者是创建了镜像,但是还没有启动;后者是创建了镜像还启动了。
启动镜像centos6镜像:
- 先查看一下还没有启动的镜像(我自己创建了两个)
- 启动镜像:
[root@ligen ~]# docker start dff # container id
dff
[root@ligen ~]# docker start b4
b4
解释一下-i,-t,-d的作用:
- docker run -it centos6 bash //不加参数-d,当使用命令exit或者ctrl d退出的时候,这个容器也会停止。
- docker -d 容器 //容器可以在后台运行
- docker run -d centos6 bash -c “echo 123” //这样可以在后台执行命令
给容器自定义名字:
docker run --name web1 -itd centos6 bash
[root@ligen ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1933b5a5d9b centos6 "bash" 10 seconds ago Up 9 seconds web1
查看docker历史运行信息:
docker logs 容器id
docker logs 36109cc9c
123
还有一种进入后台docker的命令:
docker attach dff #但是这种命令,当使用exit退出的时候,容器也会退出
导出容器:
docker export dff6a144fd47 > centos6.tar
恢复:
cat centos6.tar |docker import - lll
二.仓库管理:
需求分析:
之前当我们下载镜像的时候,利用pull从官网下载来镜像,但是假如我们自己做了一个镜像向分享给其他人,是不是要先上传官网,然后可以从其他地方下载。或者本地先生成文件,在拷贝到U盘里,在传给其他人。
有没有简单的方法,让别人从远程pull我的镜像呢,而又不用上传官网呢?
私有仓库:
docker除了公共仓库,也有私有仓库(容器registry),可以满足这种需求。
先说一下docker重启之后,所有容器都会stop状态,这里随便写一个脚本,可以一键start或者stop:
vim /usr/local/sbin/docker_start.sh
#!/bin/bash
read -p "input(start|stop|):" act
case $act in
start)
docker_id=`docker ps -a |awk '{print $1}' |grep -v CONTAINER`
for f in $docker_id
do
docker start $f
done
;;
stop)
docker_stop=`docker ps |awk '{print $1}'|grep -v CONTAINER`
for f in $docker_stop
do
docker stop $f
done
;;
esac
建立私有仓库:
- pull registry镜像:
pull之前,最好配置好之前写过的加速,要不然会很慢。
docker pull registry
- 既然要远程连接,那必须要ip地址对吧,docker是服务器上的一个程序,ip地址可以是服务器的。但是端口呢,怎么访问容器里面的服务呢,比如说容器里面搭建了一个nginx,端口80,但是这个端口是容器里面的端口,别的主机怎么可以越过服务器直接访问容器端口呢。这里需要做一个端口映射,容器里面的端口映射到服务器里面的端口:
docker run -d -p 5000:5000 registry #端口可以自己定义
右边是服务器的端口,右边是registry的端口
查看一下服务器5000端口是不是通的,可以telnet一下:
telnet 127.0.0.1 5000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
没问题
仓库算是有了,但是里面有没有东西呢,查看一下:
curl 127.0.0.1:5000/v2/_catalog
{"repositories":[]} #没有东西
- 添加镜像:
1.先给镜像打个标签(比如说centos6),需要加一个特殊标识:服务器ip和端口
docker tag centos6 106.13.219.104:5000/centos6
docker images
106.13.219.104:5000/centos6 latest c7ada98e5536 18 hours ago 553MB
更改配置文件,指定私有仓库:
{ "insecure-registries":["106.13.219.104:5000"] }
重启docker,记得start 容器。
上传镜像:
docker push 106.13.219.104:5000/centos6
查看私有仓库镜像:
curl 127.0.0.1:5000/v2/_catalog
下载镜像:
- 在本机上:
docker pull 106.13.219.104:5000/centos6
- 在另一台机器上:
首先安装好docker,增加私有仓库:
vim /etc/docker/daemon.json
{ "insecure-registries":["106.13.219.104:5000"] }
可以直接pull:
docker pull 106.13.219.104:5000/centos6
三.数据管理:
在容器里面操作,肯定会生成一些数据和文件,那么这些数据存在了哪里,如果把容器删除,这些数据也会删除。
所以可以把服务器的目录挂在到容器里面去(比如/data目录,可以用-v参数:
docker run -itd -v /data/:/data centos6 bash //前面是服务器的/data目录,后面是容器的
进入容器查看/data目录:
docker exec -it 998ebf bash
[root@998ebf7cccc5 /]# ls /data
backup log mysql.bak mysql_c redis2
db_backup mysql mysql_bak redis wwwroot
会发现和服务器的/data目录是一样的。
如果在容器里面做更改,它就会存储到服务器的/data/目录下。
挂载数据卷:
其实-v参数除了挂载目录的功能之外,还有一种挂载数据卷的功能,让容器里面的一个目录共享出来,可以让其他机器挂载:
docker run -itd --volumes-from agitated_goldwasser ubuntu bash #把agitated_goldwasser共享给了ubuntu
–volumes-from:指定要共享容器的name,docker ps 看最右侧,如果不指定它会自动生成。
定义数据卷服务:
有时候需要多个容器共享数据,类似NFS,所以可以搭建一个专门的数据卷容器,然后其他容器直接挂载该数据卷。
首先建立数据卷容器:
docker run -itd -v /data/ -name agitated_goldwasser centos bash
让其他容器挂载该数据卷:
docker run -itd --volumes-from agitated_goldwasser ubuntu bash