很久前就一直想要搭建Docker来玩一玩,不过一直没啥时间去玩,蹭这放假时间,我也赶紧搭了一个来玩一玩
环境声明
Server-10
10.0.10.10
CentOS7.5.1804
最小化安装
相关链接
软件版本信息
在安装Docker之前,我们先来看下Docker的软件版本信息
[root@server-10 ~]# yum info docker
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
可安装的软件包
名称 :docker
架构 :x86_64
时期 :2
版本 :1.13.1
发布 :63.git94f4240.el7.centos
大小 :16 M
源 :extras/7/x86_64
简介 : Automates deployment of containerized applications
网址 :https://github.com/docker/docker
协议 : ASL 2.0
描述 : Docker is an open-source engine that automates the deployment of any
: application as a lightweight, portable, self-sufficient container that will
: run virtually anywhere.
:
: Docker containers can encapsulate any payload, and will run consistently on
: and between virtually any server. The same container that a developer builds
: and tests on a laptop will run at scale, in production*, on VMs, bare-metal
: servers, OpenStack clusters, public instances, or combinations of the above.
安装
[root@server-10 ~]# yum -y install docker
版本信息
[root@server-10 ~]# docker version
Client:
Version: 1.13.1
API version: 1.26
Package version:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
当我们使用docker命令去查看版本信息的时候,会提示无法链接Dockers的daemon,问你这台主机上有运行daemon吗,所以我们还需要启动
[root@server-10 ~]# systemctl start docker
再来看版本信息
[root@server-10 ~]# docker version
Client:
Version: 1.13.1
API version: 1.26
Package version: docker-1.13.1-63.git94f4240.el7.centos.x86_64
Go version: go1.9.4
Git commit: 94f4240/1.13.1
Built: Fri May 18 15:44:33 2018
OS/Arch: linux/amd64
Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Package version: docker-1.13.1-63.git94f4240.el7.centos.x86_64
Go version: go1.9.4
Git commit: 94f4240/1.13.1
Built: Fri May 18 15:44:33 2018
OS/Arch: linux/amd64
Experimental: false
当正常启动之后就可以看到客户端和服务端的版本信息了,在这里要注意下,前端使用的版本要跟后端版本一致,因为我这里是直接使用yum安装,所以它会帮我安装前端跟后端,所以版本都回一致。
Docker命令及用法
1、查看当前镜像
命令
docker images
执行结果
[root@server-10 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
2、查看/保存 官方镜像
命令
docker search centos7
执行结果
[root@server-10 ~]# docker search centos7
# 镜像源 镜像名称 描述 星星(级别) 官方 是否支持自动安装
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/ansible/centos7-ansible Ansible on Centos7 112 [OK]
docker.io docker.io/centos/mysql-57-centos7 MySQL 5.7 SQL database server 28
···
docker.io docker.io/openshift/wildfly-120-centos7 A Centos7 based WildFly v12.0 image for us... 0
docker.io docker.io/openshift/wildfly-90-centos7 A Centos7 based WildFly v9.0 image for use... 0 [OK]
3、下载镜像
命令
# docker pull [镜像名称]
# 下载:pull 、 上传:push
docker pull docker.io/ansible/centos7-ansible
执行结果
[root@server-10 ~]# docker pull docker.io/ansible/centos7-ansible
Using default tag: latest
Trying to pull repository docker.io/ansible/centos7-ansible ...
latest: Pulling from docker.io/ansible/centos7-ansible
45a2e645736c: Pull complete
1c3acf573616: Pull complete
edcb61e55ccc: Pull complete
cbae31bad30a: Pull complete
aacbdb1e2a62: Pull complete
fdeea4fb835c: Pull complete
Digest: sha256:39eff7d56b96530d014083cd343f7314c23acbd1ecf37eb75a71a2f6584d0b02
Status: Downloaded newer image for docker.io/ansible/centos7-ansible:latest
4、创建容器
命令
# -i以交互模式运行容器(不管什么系统,装完后是命令行还是图形界面,都是交互式)
# -t为容器分配一个终端
# -d后台运行(如果不加前面-i、-t则为创建不运行,创建后容器处于关闭状态的)
# -p映射端口(docker run -it -p 80:80 --name=[容器名称] [镜像名称或镜像ID] [启动后的bash] 这样就可以把容器的80端口直接映射到宿主机的80端口)
# -v挂载宿主机某个目录到容器里面,因为我们得容器一旦删除了,容器里得数据也就被删除,为了保存数据,我们可以直接在宿主机里创建一个共享目录,挂载到容器里,让容器写数据都写到这个位置里,(docker run -it -v [宿主机目录]:[容器里的目录] --name=[容器名称] [镜像名称或镜像ID] [启动后的bash])
docker run -i -t --name=[容器名称] [镜像名称或镜像ID] [启动后的bash]
知识扩充
# 先查看镜像,已经能查看到已下载的镜像了
[root@server-10 ~]# docker images
# 镜像名称 标记 镜像ID 下载时间 镜像大小
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ansible/centos7-ansible latest 688353a31fde 18 months ago 447 MB
# 启动镜像,启动可以直接使用镜像名称或镜像ID
[root@server-10 ~]# docker run -i -t --name=test docker.io/ansible/centos7-ansible /bin/bash
[root@2f7b686b0799 ansible]#
# 查看top进程,只能看到两个进程,一个是当前所使用的bash进程,一个是我们打开的top进程,这就是docker的好处,能够最小化地运行一个系统
[root@2f7b686b0799 ~]# top
top - 07:47:15 up 1:45, 0 users, load average: 0.00, 0.01, 0.05
Tasks: 2 total, 1 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 997956 total, 76284 free, 177824 used, 743848 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 561800 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 11764 1908 1520 S 0.0 0.2 0:00.04 bash
15 root 20 0 51864 1924 1428 R 0.0 0.2 0:00.02 top
# 如果查看当前IP,无法直接用ip a的,我们需要讲ip这个命令安装后才可以使用
[root@2f7b686b0799 ~]# ip a
bash: ip: command not found
# 安装ip命令
yum -y install iproute
# 在宿docker的宿主机会多了一个网卡,这就是docker的网桥
[root@server-10 ~]# ifconfig docker0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
inet6 fe80::42:7bff:fec5:4d46 prefixlen 64 scopeid 0x20<link>
ether 02:42:7b:c5:4d:46 txqueuelen 0 (Ethernet)
RX packets 5181 bytes 215583 (210.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 7176 bytes 15850522 (15.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# 这里容器的IP是跟宿主机桥接的,它们通讯时使用单独的网段,容器只能与宿主机通讯,无法跟宿主机链接外面网络进行通讯,要借助通讯才可以,后期将会介绍
# 因为每次启动容器的时候IP都是会变得,所以可以在创建容器得时候使用--ip来固定IP
docker run -ti -name test --ip 172.17.0.2 docker.io/ansible/centos7-ansible /bin/bash
5、删除镜像
删除镜像
docker rmi [镜像名称或镜像ID]
删除容器(如果容器是在运行的,必须停止容器后才可以删除)
docker rm [容器名称/容器ID]
6、让容器在后台运行
按快捷键Ctrl+P 然后 按Ctrl+Q即可让容器在后台运行
7、查看正在运行的容器
命令
docker ps
执行结果
[root@server-10 ~]# docker ps
# 容器ID 镜像名称 运行程序 时间 运行时间 容器名称 名称
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f7b686b0799 docker.io/ansible/centos7-ansible "/bin/bash" 10 minutes ago Up 10 minutes test
如果容器已经关闭了,使用docker ps是无法看到的,要看到不在运行的容器,在后面加-a或加-all显示所有运行/没有运行的容器
[root@server-10 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f7b686b0799 docker.io/ansible/centos7-ansible "/bin/bash" 51 minutes ago Up 51 minutes test
4e4a6724b58f docker.io/ansible/centos7-ansible "/bin/bash" 54 minutes ago Exited (0) 51 minutes ago test1
8、进入当前运行的容器
命令
docker attach [容器名称/容器ID(id不需要写全,只要写前面几个它也能识别)]
执行结果
[root@server-10 ~]# docker attach test
[root@2f7b686b0799 ~]#
或
[root@server-10 ~]# docker attach 2f7b
[root@2f7b686b0799 ~]#
9、退出容器
快捷键Ctrl+D或输入exit回车即可退出容器(完全关闭容器,使用docker ps是查看不到了的)
10、启动/关闭容器
# 启动容器
docker start [容器名称/容器id]
# 关闭后台运行的容器
docker stop [容器名称/容器id]
11、安装程序
在docker里安装程序跟在CentOS里安装程序一样,直接yum安装即可,这里简单安装个httpd
[root@2f7b686b0799 ~]# yum -y install httpd
启动程序不能直接跟CentOS7一样使用systemctl启动程序,因为它是精简的系统,没有system的工具的,所以需要直接运行它的程序
# 启动时会报错,这个没有关系的,报错的原因时因为在httpd配置文件里没有定义ServerName,如果不想它报这个错,就去添加ServerName
[root@2f7b686b0799 ~]# httpd
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
# 查看端口
[root@2f7b686b0799 ~]# ss -lntp | grep 80
Cannot open netlink socket: Permission denied
LISTEN 0 0 :::80 :::* users:(("httpd",pid=125,fd=4))
# 验证
[root@2f7b686b0799 ~]# echo 'htllo docker' >/var/www/html/index.html
[root@2f7b686b0799 ~]# curl http://localhost
htllo docker
12、让容器支持ssh链接
# 安装sshd服务
yum install openssh-server
# 生成key
ssh-keygen -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key
# 启动sshd服务(后台运行)
/sbin/sshd -D &
因为装完sshd后默认没有开机启动的,所以我们需要将它加入开机启动中,可以直接将上面的启动命令直接加入/etc/rc.local文件中
Docker程序的目录结构
[root@server-10 ~]# rpm -ql docker
/etc/docker
/etc/docker/certs.d
/etc/docker/certs.d/redhat.com
/etc/docker/certs.d/redhat.com/redhat-ca.crt
/etc/docker/certs.d/redhat.io
/etc/docker/certs.d/redhat.io/redhat-ca.crt
/etc/docker/certs.d/registry.access.redhat.com
/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt
/etc/docker/daemon.json
/etc/docker/seccomp.json
/etc/sysconfig/docker-network
/etc/sysconfig/docker-storage
/etc/sysconfig/docker-storage-setup
/usr/bin/docker-containerd-current
/usr/bin/docker-containerd-shim-current
/usr/bin/docker-ctr-current
/usr/bin/docker-storage-setup
/usr/bin/dockerd-current
/usr/lib/systemd/system/docker-cleanup.service
/usr/lib/systemd/system/docker-cleanup.timer
/usr/lib/systemd/system/docker-storage-setup.service
/usr/lib/systemd/system/docker.service
/usr/lib/udev/rules.d/80-docker.rules
/usr/libexec/docker
/usr/libexec/docker/docker-init-current
/usr/libexec/docker/docker-proxy-current
/usr/libexec/docker/docker-runc-current
/usr/share/bash-completion/completions/docker
/usr/share/doc/docker-1.13.1
/usr/share/doc/docker-1.13.1/AUTHORS
/usr/share/doc/docker-1.13.1/CHANGELOG.md
/usr/share/doc/docker-1.13.1/CONTRIBUTING.md
/usr/share/doc/docker-1.13.1/MAINTAINERS
/usr/share/doc/docker-1.13.1/NOTICE
/usr/share/doc/docker-1.13.1/README-vim-syntax.md
/usr/share/doc/docker-1.13.1/README.md
/usr/share/fish/vendor_completions.d
/usr/share/fish/vendor_completions.d/docker.fish
/usr/share/licenses/docker-1.13.1
/usr/share/licenses/docker-1.13.1/LICENSE
/usr/share/licenses/docker-1.13.1/LICENSE-vim-syntax
/usr/share/man/man1/docker-attach.1.gz
/usr/share/man/man1/docker-build.1.gz
/usr/share/man/man1/docker-commit.1.gz
/usr/share/man/man1/docker-cp.1.gz
/usr/share/man/man1/docker-create.1.gz
/usr/share/man/man1/docker-diff.1.gz
/usr/share/man/man1/docker-events.1.gz
/usr/share/man/man1/docker-exec.1.gz
/usr/share/man/man1/docker-export.1.gz
/usr/share/man/man1/docker-history.1.gz
/usr/share/man/man1/docker-images.1.gz
/usr/share/man/man1/docker-import.1.gz
/usr/share/man/man1/docker-info.1.gz
/usr/share/man/man1/docker-inspect.1.gz
/usr/share/man/man1/docker-kill.1.gz
/usr/share/man/man1/docker-load.1.gz
/usr/share/man/man1/docker-login.1.gz
/usr/share/man/man1/docker-logout.1.gz
/usr/share/man/man1/docker-logs.1.gz
/usr/share/man/man1/docker-network-connect.1.gz
/usr/share/man/man1/docker-network-create.1.gz
/usr/share/man/man1/docker-network-disconnect.1.gz
/usr/share/man/man1/docker-network-inspect.1.gz
/usr/share/man/man1/docker-network-ls.1.gz
/usr/share/man/man1/docker-network-rm.1.gz
/usr/share/man/man1/docker-pause.1.gz
/usr/share/man/man1/docker-port.1.gz
/usr/share/man/man1/docker-ps.1.gz
/usr/share/man/man1/docker-pull.1.gz
/usr/share/man/man1/docker-push.1.gz
/usr/share/man/man1/docker-rename.1.gz
/usr/share/man/man1/docker-restart.1.gz
/usr/share/man/man1/docker-rm.1.gz
/usr/share/man/man1/docker-rmi.1.gz
/usr/share/man/man1/docker-run.1.gz
/usr/share/man/man1/docker-save.1.gz
/usr/share/man/man1/docker-search.1.gz
/usr/share/man/man1/docker-start.1.gz
/usr/share/man/man1/docker-stats.1.gz
/usr/share/man/man1/docker-stop.1.gz
/usr/share/man/man1/docker-storage-setup.1.gz
/usr/share/man/man1/docker-tag.1.gz
/usr/share/man/man1/docker-top.1.gz
/usr/share/man/man1/docker-unpause.1.gz
/usr/share/man/man1/docker-update.1.gz
/usr/share/man/man1/docker-version.1.gz
/usr/share/man/man1/docker-wait.1.gz
/usr/share/man/man1/docker.1.gz
/usr/share/man/man5/Dockerfile.5.gz
/usr/share/man/man5/docker-config-json.5.gz
/usr/share/man/man8/dockerd.8.gz
/usr/share/vim/vimfiles/doc
/usr/share/vim/vimfiles/doc/dockerfile.txt
/usr/share/vim/vimfiles/ftdetect
/usr/share/vim/vimfiles/ftdetect/dockerfile.vim
/usr/share/vim/vimfiles/syntax
/usr/share/vim/vimfiles/syntax/dockerfile.vim
/usr/share/zsh/site-functions
/usr/share/zsh/site-functions/_docker
/var/lib/docker