|
docker入门学习
作者:mj培根【mjboy】
参考:老男孩教育、docker官方手册、Google
docker安装
(1)虚拟机环境准备
yum源准备:
CentOS 7
阿里云
base源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
或者
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
之后运行yum makecache生成缓存
中科大
base源:一串文件
epel源
sudo yum install -y epel-release
sudo sed -e 's!^mirrorlist=!#mirrorlist=!g' \
-e 's!^#baseurl=!baseurl=!g' \
-e 's!//download\.fedoraproject\.org/pub!//mirrors.ustc.edu.cn!g' \
-e 's!http://mirrors\.ustc!https://mirrors.ustc!g' \
-i /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel-testing.repo
准备两台虚拟机:docker01、docker02
修改主机名和ip
docker01
hostnamectl set-hostname docker01
sed -i 's#IPADDR=10.0.0.201#IPADDR=10.0.0.11#g' /etc/sysconfig/network-scripts/ifcfg-eth0
sed -i 's#IPADDR=172.16.1.201#IPADDR=172.16.1.11#g' /etc/sysconfig/network-scripts/ifcfg-eth1
systemctl restart network.service
docker02
hostnamectl set-hostname docker02
sed -i 's#IPADDR=10.0.0.201#IPADDR=10.0.0.12#g' /etc/sysconfig/network-scripts/ifcfg-eth0
sed -i 's#IPADDR=172.16.1.201#IPADDR=172.16.1.12#g' /etc/sysconfig/network-scripts/ifcfg-eth1
systemctl restart network.service
host解析:
[root@docker01 ~]# vim /etc/hosts
127.0.0.1 localhost
::1 localhost
192.168.19.200 mirrors.aliyun.com
202.141.176.110 mirrors.ustc.edu.cn
[root@docker01 ~]# echo $LANG
zh_CN.UTF-8
(2)docker-ce软件准备与安装
中科大
1)docker-ce.repo
中科大:wget http://centos.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed -i 's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g' docker-ce.repo
2)docker-ce-18.03.1.ce-1.el7.centos.x86_64.rpm
下载docker-ce安装包,并yum localinstall安装
中科大:http://mirrors.ustc.edu.cn/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-18.03.1.ce-1.el7.centos.x86_64.rpm
阿里云:
https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-18.03.1.ce-1.el7.centos.x86_64.rpm
或者直接yum install -y docker即可
[root@docker01 tools]# yum localinstall docker-ce-18.03.1.ce-1.el7.centos.x86_64.rpm -y
(3)验证是否安装成功
[root@docker01 tools]# rpm -qa|grep docker
docker-ce-18.03.1.ce-1.el7.centos.x86_64
--------------------------------------------------------------------------------------------------------------
docker加速器:
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://5deb2181.m.daocloud.io
docker加速
Docker CE 的官方文档有中文版,但更新可能不如英文版及时,请移步 https://docs.docker-cn.com/engine/installation/ 。
安装完 Docker CE 之后,替换掉官方的 Docker Registry 服务,可加快拉取 Docker 镜像的速度,请
参考 Docker Hub 源使用帮助。(http://mirrors.ustc.edu.cn/help/dockerhub.html)
Docker Hub 镜像缓存
使用说明
Linux
在配置文件 /etc/docker/daemon.json 中加入:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"]
}
重新启动dockerd:
sudo service docker restart
# docker启动、关闭、重启状态查看
[root@docker01 ~]# systemctl start docker.service
[root@docker01 ~]# systemctl stop docker.service
[root@docker01 ~]# systemctl restart docker.service
[root@docker01 ~]# ps -ef|grep docker|grep -v grep
root 3604 1 0 23:31 ? 00:00:00 /usr/bin/dockerd
root 3608 3604 0 23:31 ? 00:00:00 docker-containerd --config /var/run/docker/containerd/containerd.toml
注意:docker卸载
yum list installed | grep docker
yum -y remove docker-client.x86_64 docker-common.x86_64
docker镜像操作命令
搜索镜像
docker search
获取镜像
docker pull
docker image pull
删除镜像
docker image rm alpine
docker image rm alpine:latest
docker image rm IMAGE ID [3fd9065eaf02]
导入镜像
docker image load -i docker.alpine.tar.gz
docker image import docker-mysql.tar.gz
docker image import --help
import导入方式,没有名字,没有tag,需要手动指定标签,删除需要根据image_id来删除镜像
docker镜像保存或导出
docker image save --help
Usage: docker image save [OPTIONS] IMAGE [IMAGE...]
[root@docker01 ~]# docker image save -o docker.alpine.tar.gz alpine:latest
[root@docker01 ~]# docker image save alpine:latest >docker.alpine.tar.gz
docker image history --help
docker image history alpine --镜像制作历史
docker image history --no-trunc nginx
docker image history --no-trunc nginx|grep daemon
docker容器操作命令
运行容器
[root@docker01 ~]# docker run -p 1314:80 -d --name nginx1314 nginx:latest
9cce0d2ab36b579c03800ff5a029db083b7cfba377438e3c054fde2a2004fee9
参数:docker run --help
-p 80:80:将容器的80端口映射到主机的80端口
-p, --publish list Publish a container's port(s) to the host
-P, --publish-all Publish all exposed ports to random ports
-d:容器放入后台执行
-d, --detach Run container in background and print container ID
-t, --tty Allocate a pseudo-TTY
--ulimit ulimit Ulimit options (default [])
-i, --interactive Keep STDIN open even if not attached
--name mynginx:将容器命名为mynginx
-v, --volume list Bind mount a volume
--volume-driver string Optional volume driver for the container
--volumes-from list Mount volumes from the specified container(s)
-v $PWD/www:/www:将主机中当前目录下的www挂载到容器的/www
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机中当前目录下的nginx.conf挂载到容器的/etc/nginx/nginx.conf
-v $PWD/logs:/wwwlogs:将主机中当前目录下的logs挂载到容器的/wwwlogs
停止所有容器
[root@docker01 ~]# docker stop $(docker ps -a -q)
a71bd000c483
fae714b1361e
删除容器
docker rm $(docker ps -a -q)
docker rm -f $(docker ps -a -q) --强制
docker kill $(docker ps -a -q)
进入容器
docker run -it --进入了新的容器,但是每次都会创建容器
docker exec --重新开辟新终端(pts/1和pts/2),事务隔离,相当于数据库的session
[root@docker01 ~]# docker exec -it oldboy /bin/bash
[root@49ab47eb9f3e /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 19:52 pts/0 00:00:00 /bin/bash
root 15 0 0 19:54 pts/1 00:00:00 /bin/bash
root 26 15 0 19:54 pts/1 00:00:00 ps -ef
docker attach --同一个终端(pts/0),神同步,仿佛有双眼睛能看到操作
[root@docker01 ~]# docker attach oldboy
[root@49ab47eb9f3e /]#
nsenter进入容器
yum install -y util-linux
[root@docker01 ~]# nsenter --help
用法:
nsenter [options] [...]
Run a program with namespaces of other processes.
选项:
-t, --target 要获取名字空间的目标进程
-m, --mount[=] enter mount namespace
-u, --uts[=] enter UTS namespace (hostname etc)
-i, --ipc[=] enter System V IPC namespace
-n, --net[=] enter network namespace
-p, --pid[=] enter pid namespace
-U, --user[=] enter user namespace
-S, --setuid set uid in entered namespace
-G, --setgid set gid in entered namespace
--preserve-credentials do not touch uids or gids
-r, --root[=] set the root directory
-w, --wd[=] set the working directory
-F, --no-fork 执行 前不 fork
-Z, --follow-context set SELinux context according to --target PID
-h, --help 显示此帮助并退出
-V, --version 输出版本信息并退出
[root@docker01 ~]# docker inspect oldboy222|grep -i pid
"Pid": 14962,
"PidMode": "",
"PidsLimit": 0,
[root@docker01 ~]# nsenter -t 14962 -m -n -u -i -p
[root@1698139ebfa3 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 20:14 pts/0 00:00:00 /bin/bash
root 19 0 0 20:21 pts/0 00:00:00 -bash
root 32 19 0 20:21 pts/0 00:00:00 ps -ef
注意:
(1)docker container start
前面的docker container run命令是新建容器,每运行一次,就会新建一个容器。同样的命令运行两次,就会生成两个一模一样的容器文件。
如果希望重复使用容器,就要使用docker container start命令,它用来启动已经生成、已经停止运行的容器文件。
$ docker container start [containerID]
(2)docker container stop(优雅关闭)
前面的docker container kill命令终止容器运行,相当于向容器里面的主进程发出 SIGKILL 信号。而docker container stop命令也是用来终止容器运行,相当于向容器里面的主进程发出 SIGTERM 信号,然后过一段时间再发出 SIGKILL 信号。
docker container stop [containerID] | kill差别
这两个信号的差别是,应用程序收到 SIGTERM 信号以后,可以自行进行收尾清理工作,但也可以不理会这个信号。如果收到 SIGKILL 信号,就会强行立即终止,那些正在进行中的操作会全部丢失。
docker [container] inspect
获取容器的ip地址
[root@docker01 ~]# docker container inspect cf6ef5d2476c|grep -i ipaddr
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
[root@docker01 ~]# yum install psmisc -y
[root@docker01 ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─abrt-watch-log
├─abrtd
├─2*[anacron]
├─auditd───{auditd}
├─crond
├─dbus-daemon
├─dockerd─┬─docker-containe─┬─docker-containe─┬─nginx───nginx
│ │ │ └─8*[{docker-containe}]
│ │ └─8*[{docker-containe}]
│ └─11*[{dockerd}]
├─login───bash
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd─┬─sshd───bash───pstree
│ └─sshd───bash───docker───6*[{docker}]
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─wpa_supplicant
如何让容器一直夯住?(容器一直运行)
小测试:
七、实例:hello world下面,我们通过最简单的 image 文件"hello world",感受一下 Docker。
$ docker image pull library/hello-world
上面代码中,docker image pull是抓取 image 文件的命令。library/hello-world是 image 文件在仓库里面的位置,其中library是 image 文件所在的组,hello-world是 image 文件的名字。
由于 Docker 官方提供的 image 文件,都放在library组里面,所以它的是默认组,可以省略。因此,上面的命令可以写成下面这样。
$ docker image pull hello-world
抓取成功以后,就可以在本机看到这个 image 文件了。
$ docker images
现在,运行这个 image 文件。
$ docker container run hello-world
docker container run命令会从 image 文件,生成一个正在运行的容器实例。
注意,docker container run命令具有自动抓取 image 文件的功能。如果发现本地没有指定的 image 文件,就会从仓库自动抓取。因此,前面的docker image pull命令并不是必需的步骤。
如果运行成功,你会在屏幕上读到下面的输出。
$ docker container run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
... ...
输出这段提示以后,hello world就会停止运行,容器自动终止。
有些容器不会自动终止,因为提供的是服务。比如,安装运行 Ubuntu 的 image,就可以在命令行体验 Ubuntu 系统。
$ docker container run -it ubuntu bash
对于那些不会自动终止的容器,必须使用docker container kill 命令手动终止。
$ docker container kill [containID]
docker网络访问
随机映射
docker run -P
指定映射
-p hostPort:containerPort
-p ip:hostPort:containerPort
-P ip::containerPort
-p hostPort:containerPort:udp
-p 80:80 -p 443:443
1)docker run -d -p 0.0.0.0:80:80 nginx:latest
2)
[root@a2d993b86129 /]# systemctl start sshd
Failed to get D-Bus connection: Operation not permitted
原因及解决方式:
这个的原因是因为dbus-daemon没能启动。其实systemctl并不是不可以使用。将你的CMD或者entrypoint设置为/usr/sbin/init即可。会自动将dbus等服务启动起来。
然后就可以使用systemctl了。命令如下:
在创建docker容器时添加--privileged
docker run --privileged -d -e "container=docker" -p 520:22 -v /sys/fs/cgroup:/sys/fs/cgroup centos /usr/sbin/init
[root@docker01 ~]# docker exec -it 44b6b1d9b7b4 /bin/bash
[root@44b6b1d9b7b4 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 21:06 ? 00:00:00 /usr/sbin/init
root 15 1 0 21:06 ? 00:00:00 /usr/lib/systemd/systemd-journ
root 28 1 0 21:06 ? 00:00:00 /usr/lib/systemd/systemd-udevd
root 45 1 0 21:06 ? 00:00:00 /usr/lib/systemd/systemd-login
dbus 46 1 0 21:06 ? 00:00:00 /bin/dbus-daemon --system --ad
root 65 0 0 21:07 pts/0 00:00:00 /bin/bash
root 77 65 0 21:07 pts/0 00:00:00 ps -ef
docker的数据卷管理
数据卷(文件或目录)
-v src:destination
宿主机与容器是保持同步的,访问源的目录或文件,就是访问卷的目录或文件(两个人穿一条裤子,但是删除不会同步)
删除容器,会报资源繁忙
root@1c0ff7c3f5f1:/# rm -f /usr/share/nginx/html/index.html
rm: cannot remove '/usr/share/nginx/html/index.html': Device or resource busy
删除宿主文件,容器不会同步,我行我素,只能重新构建容器文件
--volumes-from --可以借助第一次创建的容器数据卷映射,减少冗长的目录或文件书写
[root@docker01 ~]# docker run -d --name mynginx -p 80:80 -v /data:/usr/share/nginx/html/ nginx:latest
baf6fefeb0062273e654d7798fc1677e1b5ebb5fc6d3d330179db50c5e7e7b01
[root@docker01 ~]#
[root@docker01 ~]#
[root@docker01 ~]# ls -ld /data/
drwxr-xr-x 2 root root 6 5月 3 07:41 /data/
[root@docker01 ~]#
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
baf6fefeb006 nginx:latest "nginx -g 'daemon of…" 37 seconds ago Up 36 seconds 0.0.0.0:80->80/tcp mynginx
[root@docker01 ~]# cd /data/
[root@docker01 data]# ll
总用量 0
[root@docker01 data]# echo "docker hello world" >index.html
[root@docker01 data]# docker run -d --name nginx2 -p 81:80 --volumes-from mynginx nginx:latest
6fa779d1e30d19c12ca7232c4476b2171da7316a907854157496c16396f5fb42
[root@docker01 data]#
html中文乱码解决:
index.html
能人所不能,忍人所不忍
培根,醒醒吧,不要再沉睡了
手动制作docker镜像
docker commit
一、制作sshd镜像(centos-6.9-sshd )
[root@docker01 data]# docker run -it -p 1122:22 guyton/centos6 /bin/bash
[root@a2a67ba14d85 /]#
[root@a2a67ba14d85 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 20:24 pts/0 00:00:00 /bin/bash
root 11 1 0 20:24 pts/0 00:00:00 ps -ef
[root@a2a67ba14d85 /]#
[root@a2a67ba14d85 /]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
[root@a2a67ba14d85 /]#
[root@a2a67ba14d85 /]# yum install -y openssh-server
[root@a2a67ba14d85 /]# ls -l /etc/ssh
total 132
-rw------- 1 root root 125811 Aug 31 2017 moduli
-rw-r--r-- 1 root root 2047 Aug 31 2017 ssh_config
-rw------- 1 root root 3879 Aug 31 2017 sshd_config
[root@a2a67ba14d85 /]# /etc/init.d/sshd start
Generating SSH2 RSA host key: [ OK ]
Generating SSH1 RSA host key: [ OK ]
Generating SSH2 DSA host key: [ OK ]
Starting sshd: [ OK ]
[root@a2a67ba14d85 /]# ls -l /etc/ssh
total 156
-rw------- 1 root root 125811 Aug 31 2017 moduli
-rw-r--r-- 1 root root 2047 Aug 31 2017 ssh_config
-rw------- 1 root root 668 May 2 20:29 ssh_host_dsa_key
-rw-r--r-- 1 root root 590 May 2 20:29 ssh_host_dsa_key.pub
-rw------- 1 root root 963 May 2 20:29 ssh_host_key
-rw-r--r-- 1 root root 627 May 2 20:29 ssh_host_key.pub
-rw------- 1 root root 1675 May 2 20:29 ssh_host_rsa_key
-rw-r--r-- 1 root root 382 May 2 20:29 ssh_host_rsa_key.pub
-rw------- 1 root root 3879 Aug 31 2017 sshd_config
[root@a2a67ba14d85 /]#
先停止sshd
[root@a2a67ba14d85 /]# /etc/init.d/sshd stop
Stopping sshd: [ OK ]
[root@a2a67ba14d85 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 20:24 pts/0 00:00:00 /bin/bash
root 85 1 0 20:26 ? 00:00:00 /sbin/udevd -d
root 162 1 0 20:32 pts/0 00:00:00 ps -ef
[root@a2a67ba14d85 /]#
关键步骤:把它夯住,Ctrl+p,ctrl+q组合退出容器,这样确保了sshd进程仍然存在
[root@a2a67ba14d85 /]# /usr/sbin/sshd -D
[root@docker01 data]#
[root@docker01 data]# docker commit a2a67ba14d85 centos-6.9-sshd
sha256:25f64b657ea0377b7801086ba4d57b0100a840bb62dfca8e71b5027acc8ea4aa
[root@docker01 data]#
[root@docker01 data]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-6.9-sshd latest 25f64b657ea0 9 seconds ago 322MB
nginx latest ae513a47849c 2 days ago 109MB
httpd latest fb2f3851a971 2 days ago 177MB
guyton/centos6 latest 89e582eff18a 2 weeks ago 197MB
centos latest e934aafc2206 3 weeks ago 199MB
alpine latest 3fd9065eaf02 3 months ago 4.14MB
ansible/centos7-ansible latest 688353a31fde 16 months ago 447MB
[root@docker01 data]#
[root@docker01 ssh]# ssh root@10.0.0.11 -p 52113
The authenticity of host '[10.0.0.11]:52113 ([10.0.0.11]:52113)' can't be established.
RSA key fingerprint is SHA256:e8pPc/HX02Ft3/pBwEVQXAaDy0h0SvaJ0cuBGIRmjjs.
RSA key fingerprint is MD5:42:4a:30:ec:30:45:35:e9:d4:be:1d:a7:2e:0b:eb:0d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[10.0.0.11]:52113' (RSA) to the list of known hosts.
root@10.0.0.11's password:
Last login: Wed May 2 21:07:32 2018 from 172.17.0.1
两种访问方式:
ssh root@10.0.0.11 -p 52113
ssh root@172.17.0.2 -p 22
问题:
[root@docker01 ssh]# ssh root@172.17.0.2 -p 22 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@br/>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
|
|