下载并安装
docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm
docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm
并启docker
镜像命令
列出本地镜像
docker images
docker images -a 列出本地所有的镜像
docker images -q 只显示ID
docker images -qa 列出所有的镜像ID
docker images --digests 显示镜像的摘要信息
docker images --no-trunc 显示完整的镜像信息
从 https://hub.docker.com 查找镜像
docker images search (image name)
docker images search (-s 50 image name) 查找星数大于50的指定镜像
docker images search (-s 50 --no-trunc image name) 查找星数大于50的指定镜像的详细信息
下载镜像
docker pull (image name[: TAG])
删除某个镜像
docker rmi (image name[: TAG])
docker rmi -f (image name[: TAG]) 强制删除
docker rmi -f $(docker images -qa) 全部删除
Dockerfile构建docker镜像
docker build -f Dockerfile -t imageName .
Docker重命名镜像REPOSITORY和TAG
docker tag IMAGEID(镜像id) REPOSITORY:TAG
容器命令
新建并启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARGS...]
OPTIONS:
--name="容器名称":为容器指定一个名称
-d:后台运行容器,并返回容器ID,即启动守护式容器
-i:以交互模式运行容器,通常与-t同时使用
-t:为容器重新分配一个伪输入终端,通常与-i同时使用
-P:随机端口映射
-p:指定端口映射,有以下四种格式:
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
(例:docker run -it -p 8888:8080 tomcat
docker启动tomcat容器,8888为docker端口、8080为tomcat容器的端口,访问路径为docker端口,即IP:8888)
注:Docker容器后台运行就必须要有一个前台进程,容器运行命令如果不是一直挂起的命令(如:top,taail),会自动退出。
(docker run -d centos /bin/sh -c "while true; do echo hello; sleep 2;done",后台启动容器并持续交互)
列出当前所有正在运行的容器
docker ps [OPTIONS]
OPTIONS:
-a:列出当前所有正在运行的容器和历史运行过的容器
-l:显示最近创建的容器
-n args:显示最近n个创建的容器
-q:静默模式,只显示容器编号
--no-trunc:不截断输出
退出容器
exit:容器停止退出
ctrl+P+Q:容器不停止退出
启动容器
docker start containerID | containerName
重启容器
docker restart containerID | containerName
停止容器
docker stop containerID | containerName
强制停止容器
docker kill containerID | containerName
删除已停止容器
docker rm containerID
查看容器日志
docker logs -f -t --tail containerID
-t:加入时间戳
-f:跟随最新日志打印
-tail:数字 显示最后多少条
查看容器内运行的进程
docker top containerID
查看容器内部细节
docker inspect containerID
进入正在运行的容器并以命令行交互
docker attach containerID 直接进入容器命令终端,不会启动新的进程
docker exec -t containerID (/bin/bash) 在容器中打开新的终端,并且可以启动新的进程
从容器内拷贝文件到宿主机
docker cp containerID:容器内的路径 宿主机路径
提交容器副本使之成为新的镜像
docker commit -a="author" -m="desc" containerID imageRepository
[root@foundation19 ~]# docker version
Client:
Version: 17.03.1-ce
API version: 1.27
Go version: go1.7.5
Git commit: c6d412e
Built: Fri Mar 24 00:36:45 2017
OS/Arch: linux/amd64
Server:
Version: 17.03.1-ce
API version: 1.27 (minimum version 1.12)
Go version: go1.7.5
Git commit: c6d412e
Built: Fri Mar 24 00:36:45 2017
OS/Arch: linux/amd64
Experimental: false
[root@foundation19 ~]# docker load -i game2048.tar #导入镜像
011b303988d2: Loading layer 5.05 MB/5.05 MB
36e9226e74f8: Loading layer 51.46 MB/51.46 MB
192e9fad2abc: Loading layer 3.584 kB/3.584 kB
6d7504772167: Loading layer 4.608 kB/4.608 kB
88fca8ae768a: Loading layer 629.8 kB/629.8 kB
Loaded image: game2048:latest
[root@foundation19 ~]# docker
build export kill plugin rmi stats version
commit help load port run stop volume
container history login ps save swarm wait
cp image logout pull search system
create images logs push secret tag
diff import network rename service top
events info node restart stack unpause
exec inspect pause rm start update
[root@foundation19 ~]# docker images #查看导入的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
game2048 latest 19299002fdbe 19 months ago 55.5 MB
[root@foundation19 ~]# docker run -d #后台运行 --name vm1 game2048 #创建并运行容器使用game2048镜像
5f495832c9137668f34c12c00558166c414a8a5560df615a27e8f4a322ef7836
[root@foundation19 ~]# docker inspect vm1
docker镜像放置在docker仓库中,通过镜像生成容器,容器内东西通过镜像储存在仓库之中
[root@foundation19 ~]# docker run -d --name vm1 -v /root/aaa/:/usr/share/nginx/html nginx #将这个目录挂载在容器的/usr/share/nginx/html下
8c2a960d8d70705e610671106ceec5a11129df5c788d12d7fa575584e72140a6
网络管理
Docker 在启动时会创建一个虚拟网桥 docker0,默认地址为 172.17.42.1/16, 容器启动后都会
被桥接到 docker0 上,并自动分配到一个 IP 地址。
端口印射
[root@foundation19 ~]# docker run -d --name vm1 -p 8080:80 nginx
6554c64ce9258666a4b8068e94bd3747ed485d8b5b27a92d270da26ec2bff94f
[root@foundation19 ~]# iptables -t nat -nL #iptables查看端口数据走向
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
RETURN all -- 192.168.122.0/24 224.0.0.0/24
RETURN all -- 192.168.122.0/24 255.255.255.255
MASQUERADE tcp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
MASQUERADE udp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
MASQUERADE all -- 192.168.122.0/24 !192.168.122.0/24
MASQUERADE tcp -- 172.17.0.2 172.17.0.2 tcp dpt:80
Chain DOCKER (2 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.2:80 ##在这里 8080到80的映射
容器间的互联
vm1时nginx的服务容器
[root@foundation19 ~]# docker run -it --name vm2 --link vm1:nginx ubuntu #it交互式登陆
root@989b9a05dbeb:/# ls
cbin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
root@989b9a05dbeb:/# env #环境变量
HOSTNAME=989b9a05dbeb
TERM=xterm
NGINX_ENV_NJS_VERSION=1.15.2.0.2.2-1~stretch
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
NGINX_ENV_NGINX_VERSION=1.15.2-1~stretch
NGINX_NAME=/vm2/nginx
NGINX_PORT_80_TCP_PROTO=tcp
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
SHLVL=1
HOME=/root
NGINX_PORT_80_TCP=tcp://172.17.0.2:80
NGINX_PORT_80_TCP_PORT=80
LESSOPEN=| /usr/bin/lesspipe %s
NGINX_PORT_80_TCP_ADDR=172.17.0.2
LESSCLOSE=/usr/bin/lesspipe %s %s
NGINX_PORT=tcp://172.17.0.2:80
_=/usr/bin/env
root@989b9a05dbeb:/# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 nginx 6554c64ce925 vm1
172.17.0.3 989b9a05dbeb
root@989b9a05dbeb:/# ping nginx
PING nginx (172.17.0.2) 56(84) bytes of data.
64 bytes from nginx (172.17.0.2): icmp_seq=1 ttl=64 time=0.100 ms
64 bytes from nginx (172.17.0.2): icmp_seq=2 ttl=64 time=0.096 ms
64 bytes from nginx (172.17.0.2): icmp_seq=3 ttl=64 time=0.093 ms
[root@foundation19 tmp]# mkdir docker
[root@foundation19 tmp]# cd docker/
[root@foundation19 docker]#
[root@foundation19 docker]# vim Dcokerfile
[root@foundation19 docker]# vim Dokerfilec^C
[root@foundation19 docker]# mv Dcokerfile Dokerfile
[root@foundation19 docker]# vim Dokerfile
[root@foundation19 docker]# mv Dokerfile Dockerfile
[root@foundation19 docker]# vim Dockerfile
[root@foundation19 docker]# vim Dockerfile
[root@foundation19 docker]# cp /etc/yum.repos.d/rhel-dvd.repo ./dvd.repo
[root@foundation19 docker]# ls
Dockerfile dvd.repo
[root@foundation19 docker]# vim dvd.repo
[root@foundation19 docker]# vim dvd.repo
[root@foundation19 docker]# vim dvd.repo
[root@foundation19 docker]# ping 172.17.0.1
PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data.
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.049 ms
^C
--- 172.17.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.049/0.049/0.049/0.000 ms
[root@foundation19 docker]#
[root@foundation19 docker]# ls
Dockerfile dvd.repo
[root@foundation19 docker]# docker build -t rhel7:v1 .
[root@foundation19 docker]# cat Dockerfile
FROM rhel7
ENV HOSTNAME server1
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN rpmdb --rebuilddb && yum install -y httpd && yum clean all
VOLUME ["/var/www/html"]
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
docker registry带ssl认证的私有仓库搭建
1.首先docker pull registry默认下载最新版的镜像
2.这边考虑私有仓库部署的服务器可能没有网络,可以使用docker save -o registry.tar registry:2.6.2保存一个镜像,然后把registry.tar打包到部署包里面,下次使用docker load -i registry.tar加载到本地镜像
3.保证ssl已安装,且/ect/ssl/openssl.cnf中关于生成密码定义的字段都有(网上可以查)
1. 制作证书,可采用OPENSSL
在ROOT下执行,把证书保存在/root/certs目录下
openssl req -newkey rsa:2048 -nodes -sha256 -keyout /root/certs/domain.key -x509 -days 365 -out /root/certs/domain.crt
把证书COPY到:
自签名证书,使用Docker Registry的Docker机需要将domain.crt拷贝到 /etc/docker/certs.d/[docker_registry_domain]/ca.crt,
cp certs/domain.crt /etc/docker/certs.d/mydockerhub.com:5000/ca.crt
将domain.crt内容放入系统的CA bundle文件当中,使操作系统信任我们的自签名证书。
CentOS 6 / 7中bundle文件的位置在/etc/pki/tls/certs/ca-bundle.crt
cat domain.crt >> /etc/pki/tls/certs/ca-bundle.crt
untu/Debian Bundle文件地址/etc/ssl/certs/ca-certificates.crt
cat domain.crt >> /etc/ssl/certs/ca-certificates.crt
- 启动DOCKER REGISTRY
docker run -d -p 5000:5000 --privileged=true -v /opt/registry:/tmp/registry -v ~/certs/:/root/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/root/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/root/certs/domain.key registry