设为首页 收藏本站
查看: 1017|回复: 0

[经验分享] docker入门学习【mjboy】

[复制链接]

尚未签到

发表于 2019-2-21 12:16:09 | 显示全部楼层 |阅读模式
  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/>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-675344-1-1.html 上篇帖子: Docker私有仓库与镜像加速器配置与使用 下篇帖子: Docker简介以及使用领域和架构
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表