Docker基本操作(容器管理、创建镜像)

什么是Docker 镜像?

Docker 镜像就是一个只读的模板。
例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。镜像可以用来创建 Docker 容器。
Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

什么是Docker 容器?

Docker 利用容器来运行应用。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。


安装 Docker 引擎

1.在阿里云注册账号 进入阿里云 https://www.aliyun.com/ 登陆后,进入【管理中心】

2.安装 docker 引擎 如果是安装最新版本 docker:
【管理中心】 –> Docker镜像仓库 –> 加速器 –> centos

如果需要安装 docker 历史版本:
Docker Engine镜像源站

搭建docker环境

[root@foundation40 ~]# yum install -y docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm
[root@foundation40 ~]# systemctl start docker
[root@foundation40 ~]# docker info    # docker宿主机的信息

镜像的导入和容器的使用

1.将game2048这个镜像加载

get game2048.tar 
[root@foundation40 ~]# docker load -i game2048.tar   #安装镜像

2.运行docker

[root@foundation40 ~]# docker run -d --name westos game2048    #-d打入后台 --name表示为这个容器起的名字是westos
    22b11e9b1094a64c4ab4fcf9c02aa40113c64a89b601872efd338b015489697b

3.查看容器列表

[root@foundation40 ~]# docker ps -a   #查看容器列表
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
22b11e9b1094        game2048            "/bin/sh -c 'sed -..."   About a minute ago   Up About a minute   80/tcp, 443/tcp     westos
[root@foundation40 ~]# ip addr

在安装好docker后,linux系统会为docker容器分配一个ip,利用ip addr中查看docker0的ip
这里写图片描述
4.查看westos容器的ip

[root@foundation40 ~]# docker inspect westos   #查看westos容器的ip

这里写图片描述

5.在本机浏览器中输入该ip,访问该容器网址(这个172.17.0.2是自己私有的ip地址,别人不能访问)
这里写图片描述

扫描二维码关注公众号,回复: 4683886 查看本文章

Docker常用命令

管理命令:
  container   管理容器
  image       管理镜像
  network     管理网络
命令:
  attach      介入到一个正在运行的容器
  build       根据 Dockerfile 构建一个镜像
  commit      根据容器的更改创建一个新的镜像
  cp          在本地文件系统与容器中复制 文件/文件夹
  create      创建一个新容器
  exec        在容器中执行一条命令
  images      列出镜像
  kill        杀死一个或多个正在运行的容器    
  logs        取得容器的日志
  pause       暂停一个或多个容器的所有进程
  ps          列出所有容器
  pull        拉取一个镜像或仓库到 registry
  push        推送一个镜像或仓库到 registry
  rename      重命名一个容器
  restart     重新启动一个或多个容器
  rm          删除一个或多个容器
  rmi         删除一个或多个镜像
  run         在一个新的容器中执行一条命令
  search      在 Docker Hub 中搜索镜像
  start       启动一个或多个已经停止运行的容器
  stats       显示一个容器的实时资源占用
  stop        停止一个或多个正在运行的容器
  tag         为镜像创建一个新的标签
  top         显示一个容器内的所有进程
  unpause     恢复一个或多个容器内所有被暂停的进程

拉取网络镜像

1.编写镜像加速的文件

[root@foundation40 ~]# cd /etc/docker/
[root@foundation40 docker]# vim daemon.json 
{
  "registry-mirrors": ["https://iklzfcq9.mirror.aliyuncs.com"]
}           # 阿里云中镜像加速的属于你的ip

2.重启服务

[root@foundation40 docker]# systemctl daemon-reload
[root@foundation40 docker]# systemctl restart docker

3.拉取nginx镜像

[root@foundation40 ~]# cd /etc/docker/
[root@foundation40 docker]# docker pull nginx
[root@foundation40 docker]# docker load -i nginx.tar  #从tar归档文件读取镜像
[root@foundation40 docker]# docker run -d --name vm2 nginx
[root@foundation40 docker]# docker inspect vm2  #查看私有 vm2的镜像IP

这里写图片描述
4.网页访问http://172.17.0.2/可以看到nginx网页
这里写图片描述
5.向容器中的nginx服务传送html发布主页
第一种方法:

[root@foundation40 ~]# vim index.html    # 编辑nginx服务的首页
www.westos.org
[root@foundation40 ~]# docker cp index.html vm2:/usr/share/nginx/html    # 远程拷贝首页到镜像nginx的发布目录中

网页访问http://172.17.0.2/ 可以看到自己编写的网页
这里写图片描述

第二种方法:在物理主机打开容器时-v挂载
创建web容器的发布文件,把发布文件复制到web容器

[root@foundation40 ~]# vim index.html
<h1>www.westos.org</h1>
[root@foundation40 ~]# cd /tmp
[root@foundation40 tmp]# mkdir docker
[root@foundation40 tmp]# cd docker/
[root@foundation40 docker]# mkdir web
[root@foundation40 docker]# cd
[root@foundation40 ~]# mv index.html /tmp/docker/web/
[root@foundation40 ~]# docker rm -f vm2   # 删除上边已经命名的vm2
[root@foundation40 ~]# docker run -d --name vm2 -v /tmp/docker/web:/usr/share/nginx/html nginx   # 在本地导入nginx的默认发布目录
-v表示把宿主机的目录挂载到容器中

这里写图片描述

网页访问http://172.17.0.2/可以看到自己写的发布目录
这里写图片描述


数据卷管理

docker run 在创建容器时使用 -v 参数可以挂载一个或多个数据卷到当前运行的容器中,-v的作用是将宿主机上的目录作为容器的数据卷挂载到容器中,使宿主机和容器之间可以共享一个目录。可以重复使用,挂载多个数据卷到容器中,冒号前面的是宿主机的目录(本地目录不存在 docker 会自动创建),冒号后面的是容器中的挂载目录。

在平台获取 rhel7.tar
[root@foundation40 ~]# docker load -i rhel7.tar 

1.挂载数据卷到新创建的容器上

[root@foundation40 ~]# docker rm -f  vm2
[root@foundation40 ~]# cd /tmp
[root@foundation40 tmp]# mkdir data1
[root@foundation40 tmp]# mkdir data2
[root@foundation40 tmp]# docker run -it --name vm1 -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/rhel-dvd.repo:/etc/yum.repos.d/rhel-dvd.repo:ro rhel7 /bin/bash

bash-4.2# cd /data2
bash-4.2# touch file
bash-4.2# cd /data1
bash-4.2# touch file 
bash-4.2# ls
退出时按ctrl+pq 是退出容器不停止运行
ctrl+d 是退出容器并停止运行

这里写图片描述
这里写图片描述
2.测试在data1目录里是可写的

[root@foundation40 tmp]# cd data1
[root@foundation40 data1]# ls
file
[root@foundation40 data1]# touch file1
[root@foundation40 data1]# ls
file  file1

3.挂载宿主机文件

[root@foundation40 data1]# cd ..
[root@foundation40 tmp]# cd data2
[root@foundation40 data2]# docker create  --name datavol -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/rhel-dvd.repo:/etc/yum.repos.d/rhel-dvd.repo:ro 

4.数据卷容器

[root@foundation40 data2]# docker run -it --name vm1 --volumes-from datavol rhel7 bash
[root@foundation40 data2]# docker run -it --name vm2 -v /tmp/backup:/backup rhel7 bash

5.备份数据卷

[root@foundation40 backup]# docker run --rm -v /tmp/backup:/backup ubuntu tar cf /backup/etc.tar /etc

6.在data1的目录里是可读可写的

[root@foundation40 ~]# docker run -it --name vm1 -v /data1 ubuntu
root@50b7cb834d07:/# cd /data1
root@50b7cb834d07:/data1# [root@foundation40 ~]# 
[root@foundation40 ~]# docker inspect vm1 |grep vol
                "Type": "volume",
                "Source": "/var/lib/docker/volumes/d8910f48c4bae02e1cbe0e5bc1c4725a9ee3785df66a1d7a55f4083089463769/_data",
[root@foundation40 ~]# cd /var/lib/docker/volumes/d8910f48c4bae02e1cbe0e5bc1c4725a9ee3785df66a1d7a55f4083089463769/_data
[root@foundation40 _data]# ls
[root@foundation40 _data]# cp /etc/passwd .
[root@foundation40 _data]# ls
passwd
[root@foundation40 _data]# pwd

这里写图片描述
测试

[root@foundation40 ~]# docker container attach vm1
root@50b7cb834d07:/data1# 
root@50b7cb834d07:/data1# ls
passwd
[root@foundation40 ~]# docker run -d --name vm2 -v /usr/share/nginx/html nginx
ed53537b6569462e6b0800834b67fa063e8d1a8d511c750f37798c7ab2e3bd57
[root@foundation40 ~]# docker ps
[root@foundation40 ~]# docker inspect vm2 |grep vol
root@foundation40 ~]# cd /var/lib/docker/volumes/25f2dbe141506c2d56995bce2c2c282ca991b3c3e5b78752c2e8890ca8bb797f/_data
[root@foundation40 _data]# ls
50x.html  index.html

这里写图片描述

删除独立卷

[root@foundation40 ~]# docker stop vm2
[root@foundation40 ~]# docker rm -f vm2
[root@foundation40 ~]# docker volume rm 25f2dbe141506c2d56995bce2c2c282ca991b3c3e5b78752c2e8890ca8bb797f
[root@foundation40 ~]# cd -     #删除后就cd不到目录下
[root@foundation40 ~]# docker volume ls   #查看是否还有卷未删除
[root@foundation40 ~]# docker volume rm `docker volume ls -q`   #删除全部

网络管理

获取容器的PID

[root@foundation40 backup]# cd /proc/
[root@foundation40 proc]# docker start vm1
[root@foundation40 proc]# docker inspect vm1 |grep Pid

这里写图片描述

[root@foundation40 proc]# cd 13999/
[root@foundation40 13999]# cd net
[root@foundation40 net]# cd ..
[root@foundation40 13999]# cd ns/
[root@foundation40 ns]# ls
ipc  mnt  net  pid  user  uts
[root@foundation40 ns]# cd /etc/docker
[root@foundation40 docker]# docker ps
[root@foundation40 docker]# brctl show

这里写图片描述

[root@foundation40 docker]# docker stop vm1
[root@foundation40 docker]# brctl show

这里写图片描述

[root@foundation40 docker]# docker start vm1
[root@foundation40 docker]# docker start vm2
[root@foundation40 docker]# brctl show

这里写图片描述

host模式

host模式:使用docker run时使用–net=host指定,docker使用的网络实际上和宿主机一样,在容器内看到的网卡ip是宿主机上的ip。host模式很好的解决了容器与外界通信的地址转换问题,可以直接使用宿主机的IP镜像通信。但是也降低了隔离性,同时还会引起网络资源的竞争和冲突。

[root@foundation40 docker]# docker run -it --name  vm3 ubuntu
[root@foundation40 docker]# docker rm -f vm3
[root@foundation40 docker]# docker run -it --name vm3 --net host ubuntu
root@foundation40:/# ip addr

这里写图片描述

container复用方式

container模式:多个容器使用共同的网络,看到的ip是一样的。container模式的应用场景就在于可以将一个应用的多个组件放在不同的容器中,这些容器配成container模式的网络,这样它们就可以作为一个整体对外提供服务。同样这种模式也降低了容器间的隔离性。

[root@foundation40 docker]# docker run -it --name  vm4 ubuntu
[root@foundation40 ~]# docker rm -f vm4
[root@foundation40 ~]# docker run -it --name vm4 --net container:vm2 ubuntu
root@e7286e084886:/# ip addr

这里写图片描述

none方式

none模式:使用–net=none指定:这种模式下不会配置任何网络,它给了用户最大的自由度来自定义容器的网络环境。

[root@foundation40 ~]# docker run -it --name vm5 --net none ubuntu
root@a78003cd794e:/# ip addr

这里写图片描述

重新开一个shell窗口:自己指定设置网络

[root@foundation40 ~]# docker inspect vm5 |grep Pid
            "Pid": 16564,
            "PidMode": "",
            "PidsLimit": 0,
[root@foundation40 ~]# cd /proc/16564
[root@foundation40 16564]# cd ns/
[root@foundation40 ns]# ls
ipc  mnt  net  pid  user  uts
[root@foundation40 ns]# ll

这里写图片描述

[root@foundation40 ns]# ip netns add test
[root@foundation40 ns]# ip netns list
test
[root@foundation40 ns]# cd /var/run/
[root@foundation40 run]# cd netns/
[root@foundation40 netns]# ls
test
[root@foundation40 netns]# ip netns del test
[root@foundation40 netns]# ls
[root@foundation40 netns]# ln -s /proc/16564/ns/net /var/run/netns/16564
[root@foundation40 netns]# ip netns list
16564
[root@foundation40 netns]# ip link add name veth0 type veth peer name veth1
[root@foundation40 netns]# ip addr

这里写图片描述

[root@foundation40 netns]# brctl show
[root@foundation40 netns]# brctl addif docker0 veth0
[root@foundation40 netns]# brctl show

这里写图片描述

[root@foundation40 netns]# ip link set up veth0
[root@foundation40 netns]# ip link set up veth1
[root@foundation40 netns]# ip addr

这里写图片描述

[root@foundation40 netns]# ip link set veth1 netns 16564
[root@foundation40 netns]# ip netns exec 16564 ip link set veth1 name eth0
[root@foundation40 netns]# ip netns exec 16564 ip link set up dev eth0
[root@foundation40 netns]# ip netns exec 16564 ip link set up dev eth1
Cannot find device "eth1"
[root@foundation40 netns]# ip netns exec 16564 ip addr add 172.17.0.100/24 dev eth0
[root@foundation40 netns]# ip netns exec 16564 ip route add default via 172.17.0.1    ##添加网关

返回之前的shell窗口

root@a78003cd794e:/# ping 172.17.0.1
root@a78003cd794e:/# ping baidu.com
root@a78003cd794e:/# route -n

使用Dockerfile创建镜像

创建apach发布目录的镜像

1.编写Dockerfile文件

[root@foundation40 ~]# vim /tmp/docker/Dockerfile
FROM rhel7      # 源镜像是rhel7
ENV HOSTNAME server1    # 定义hostname为server1
MAINTAINER 229683481@qq.com    # 定义邮箱
EXPOSE 80     # 定义端口为80
COPY yum.repo /etc/yum.repos.d/yum.repo
RUN rpmdb --rebuilddb && yum install -y httpd && yum clean all  
# 执行命令安装httpd并清除yum缓存
# rpmdb 命令用于初始化和重建rpm数据库
VOLUME ["/var/www/html"]     # 数据卷所在的位置
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]    # 打开apach服务

2.封装镜像

[root@foundation40 ~]# cd /tmp/docker/
[root@foundation40 ~]# docker build -t rhel7:v1 .

这里写图片描述
3.查看封装的镜像

[root@foundation40 docker]# docker images rhel7

这里写图片描述

封装ssh服务

可以连接别的主机也可以被别人连接
1.编辑Dockerfile文件

[root@foundation40 docker]# mkdir ssh
[root@foundation40 docker]# mkdir ssh
[root@foundation40 ssh]# vim Dockerfile 
FROM rhel7
ENV HOSTNAME server2
MAINTAINER 229683481@qq.com
EXPOSE 22            # 对外端口是22
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN rpmdb --rebuilddb && yum install -y openssh-server && yum install -y openssh-clients yum clean all && ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" && ssh-keygen -q -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N "" && echo root:redhat | chpasswd
CMD ["/usr/sbin/sshd","-D"]     #镜像启动命令,默认只能启动一条

这里写图片描述
2.开始封装镜像

[root@foundation40 ssh]# docker build -t rhel7:v2 .

这里写图片描述
3.测试能否连接

[root@foundation40 ssh]# docker run -it --name vm0 rhel7:v2
[root@foundation40 ssh]# docker inspect vm0   #查看私有地址
             "IPAddress": "172.17.0.3",
[root@foundation40 ssh]# ssh [email protected]

这里写图片描述

利用supervisord一次封装多个服务

1.编辑Dockerfile文件(使httpd和ssh结合)

[root@foundation40 /]# docker rm -f `docker ps -aq`
[root@foundation40 /]# cd /tmp/docker/
[root@foundation40 docker]# ls
[root@foundation40 docker]# vim Dockerfile 
FROM rhel7
EXPOSE 80 22
COPY yum.repo /etc/yum.repos.d/yum.repo
RUN rpmdb --rebuilddb && yum install -y httpd openssh-server openssh-clients supervisor && yum clean all && ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" && ssh-keygen -q -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N "" && echo root:westos | chpasswd
CMD ["/usr/bin/supervisord"]

这里写图片描述
2.修改yum文件

[root@foundation40 docker]# vim yum.repo 
[source7.3]
name=source7.3
baseurl=http://172.25.40.250/source7.3
gpgcheck=0

[docker]
name=docker
baseurl=http://172.25.254.250/pub/docker
gpgcheck=0

3.编辑supervisord.conf文件

[root@foundation40 docker]# vim supervisord.conf
[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D

[program:httpd]
command=/usr/sbin/httpd

4. 开始封装镜像

[root@foundation40 docker]# docker build -t rhel7:v3 .

这里写图片描述
5.用封装的镜像创建容器

[root@foundation40 docker]# docker run -d --name vm1 -v /tmp/docker/web:/var/www/html rhel7:v3
[root@foundation40 docker]# docker ps

这里写图片描述
6.测试同时具有httpd和sshd服务的容器

[root@foundation40 docker]# docker inspect vm1

这里写图片描述

测试:

[root@foundation40 docker]# curl 172.17.0.2   #可以看到网页内容
[root@foundation40 docker]# ssh -l root 172.17.0.2   #可以连接

这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/Argued_D/article/details/81837216