1.什么是Docker?
我们简单的了解一些docker-ce:
Docker是一种CS架构的软件产品,可以把代码及依赖包打包成为镜像,作为交付交质,并且把镜像启动成为容器,提供容器生命周期的管理,来提供轻量级虚拟化功能,容器就是在宿主机中的一个个虚拟空间,彼此相互隔离,完全独立。
2.工作原理
一、三大核心要素:镜像(image)、容器(Container)、仓库(Registry)
1.镜像(image)
打包了业务代码以及运行环境的包、是静态的文件、不能直接对外提供服务等功能。
2.容器(Container)
镜像的运行时,可以对外提供服务。本质上是利用Namespace和Cgroup等技术在宿主机中创建 独立的虚拟空间。
3.仓库(Registry)
公有仓库:Docker HUb 、阿里、网页等
私有仓库:内地搭建的仓库,比如企业内部搭建等
Docker Registry,Docker官方提供的镜像仓库存储服务
Harbor, 是Docker Registry的更高级封装,它除了提供了Web GUI界面,角色和用户权限
管理,用户操作审计等功能。
4.镜像访问地址形式:Registry.devops.com/demo/hello:latest,特殊情况若没有前面的url地址,则默 认寻找Docker Hub中的镜像,若没有tag标签,则使用latest做为默认标签。
3.Docker基本命令
[root@localhost ~]# docker images #查看所有镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 8 5d0da3dc9764 18 months ago 231MB
[root@localhost ~]#
[root@localhost ~]# docker pull nginx:alpine #拉取镜像pepository为nginx、tag为alpine。
alpine: Pulling from library/nginx
63b65145d645: Pull complete
8c7e1fd96380: Pull complete
86c5246c96db: Pull complete
b874033c43fb: Pull complete
dbe1551bd73f: Pull complete
0d4f6b3f3de6: Pull complete
2a41f256c40f: Pull complete
Digest: sha256:6318314189b40e73145a48060bff4783a116c34cc7241532d0d94198fb2c9629
Status: Downloaded newer image for nginx:alpine
docker.io/library/nginx:alpine
[root@localhost ~]#
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx alpine 2bc7edbc3cf2 4 weeks ago 40.7MB
centos 8 5d0da3dc9764 18 months ago 231MB
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# docker save -o nginx1.tar nginx:alpine #拉取镜像到本地,使用repository:tag
[root@localhost ~]# docker save -o nginx2.tar 2bc7edbc3cf2 #拉取镜像到本地,使用image_id
[root@localhost ~]# ll
total 316144
-rw-------. 1 root root 1023 Nov 29 12:10 anaconda-ks.cfg
-rw-r--r--. 1 root root 238581248 Mar 14 02:46 centos8.tar
-rw-------. 1 root root 42570240 Mar 14 08:38 nginx1.tar
-rw-------. 1 root root 42569216 Mar 14 08:38 nginx2.tar
[root@localhost ~]#
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 8 5d0da3dc9764 18 months ago 231MB
[root@localhost ~]#
[root@localhost ~]# docker load -i nginx1.tar #从本地文件导入镜像
7cd52847ad77: Loading layer [==================================================>] 7.338MB/7.338MB
d8a5a02a8c2d: Loading layer [==================================================>] 5.32MB/5.32MB
5e59460a18a3: Loading layer [==================================================>] 3.584kB/3.584kB
152a948bab3b: Loading layer [==================================================>] 4.608kB/4.608kB
c4d67a5827ca: Loading layer [==================================================>] 3.584kB/3.584kB
f1bee861c2ba: Loading layer [==================================================>] 7.168kB/7.168kB
042cd3f87f43: Loading layer [==================================================>] 29.85MB/29.85MB
Loaded image: nginx:alpine
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx alpine 2bc7edbc3cf2 4 weeks ago 40.7MB
centos 8 5d0da3dc9764 18 months ago 231MB
[root@localhost ~]#
[root@localhost ~]# docker save {repository:tag/image_id} > 压缩文件.tar #当然也可以使用重定向来指定导出文件
[root@localhost ~]# docker load < {repository:tag/image_id} #也可以使用反重定向来导入镜像
[root@localhost ~]# docker rmi {repository:tag/image_id} #删除镜像
[root@localhost ~]# docker ps #查看容器状态列表,docker ps -a表示列出所有容器状态
[root@localhost ~]# docker run --name 容器名称 -d {repository:tag/image_id} 解释器,如/bin/{bash,sh}
[root@localhost ~]# docker run --name 容器名称 -ti {repository:tag/image_id} /bin/bash #启动容器的同时进入容器,-ti与/bin/sh或者/bin/bash配套使用,意思未分配一个tty终端
[root@localhost ~]# docker run --name 容器名称 -d -p 80:80 {repository:tag/image_id} #端口映射,将容器端口映射到宿主机端口中
[root@localhost ~]# docker run --cpuset-cpus="0-3" --cpu-shares=512 --memory=600m {repository:tag/image_id}
--cpuset-cpus #用于设置容器可以使用的VCPU核,简写为-C
--cpu-shares #用于设置多个容器竞争CPU时,各个容器相对分配到的CPU时间比例
[root@localhost ~]#
[root@localhost ~]# docker exec -ti <container_id_or_name> /bin/bash #进入容器或者执行容器内的命令
[root@localhost ~]# docker logs 容器名称 #查看日志
[root@localhost ~]# docker logs -f 容器名称 #查看最新日志
[root@localhost ~]# docker logs --tail=100 -f 容器名称 #查看最新认证100条日志
[root@localhost ~]# docker {stop/start/rm/rm -f} 容器名称 #停止运行中容器、启动容器、删除未启动的容器、删除启动中的容器
[root@localhost ~]# docker inspect 容器名称 #详细查看容器信息
[root@localhost ~]# docker inspect {repository:tag/image_id} #详细查看镜像的信息
4.Docker实验步骤
一、题目要求:
1.在Linux-2上安装docker-ce,导入centos镜像。软件包和镜像存放在物理机D:\soft\DockerLinux。
2.创建名称为skills的容器,映射Linux-2的80端口到容器的80端口,在容器内安装apache2,默认网页内容为“HelloContainer”。
[root@localhost ~]# dnf -y install -y yum-utils device-mapper-persistent-data lvm2
[root@localhost ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@localhost ~]# dnf -y install docker-ce
[root@localhost ~]# systemctl enable --now docker
[root@localhost ~]# yumdownloader --resolve --destdir /docker docker-* #下载docker包到本地目录/docker ,然后自己用rpm安装即可
[root@localhost ~]#
第一种方法:
[root@localhost ~]# dnf -y install docker-ce
[root@localhost ~]# docker load -i /root/centos.tar
[root@localhost ~]# docker run -d --name skills -p 80:80 centos /bin/bash -c "yum update -y && yum install -y httpd && echo 'HelloContainer' > /var/www/html/index.html && /usr/sbin/httpd -DFOREGROUND"
参数解析:
docker run #创建并运行一个新的容器
-d #后台运行容器
--name skills #指定容器名称为skills
-p 80:80 #将Linux-2的80端口映射到容器的80端口
centos: #基于CentOS镜像创建容器
/bin/bash -c "yum update -y && yum install -y httpd && echo 'HelloContainer' > /var/www/html/index.html && /usr/sbin/httpd -DFOREGROUND" #容器启动后需要执行的命令
yum update -y #更新容器内的软件包
yum install -y httpd #安装Apache2 Web服务器
echo 'HelloContainer' > /var/www/html/index.html #在容器内的Apache2 Web服务器上创建默认网页,内容为"HelloContainer"
/usr/sbin/httpd -DFOREGROUND #开机启动Apache2 Web服务器
[root@localhost ~]# curl https://linux2.skills.com
HelloContainer
[root@localhost ~]#
第二种方法:
[root@localhost ~]# dnf -y install docker-ce
[root@localhost ~]# mkdir /etc/docker/httpd
[root@localhost ~]# vim /etc/docker/httpd/dockerfile
...
FROM centos:latest #镜像为centos:latest
RUN yum -y install httpd mod_ssl #在容器中安装apache和ssl模块
EXPOSE 80 #开启80短裤
ADD index.html /var/www/html/index.html #修改默认网页
ADD 1.sh ./1.sh #运行shell脚本
RUN chmod +755 1.sh #此1.sh更大的权限
CMD ["./1.sh"] #运行此脚本
...
[root@localhost ~]# vim /etc/docker/httpd/1.sh
...
#!/bin/bash #解释器
rm -rf /run/httpd/* #清空httpd缓存
exec /usr/sbin/apachectl -D FOREGROUND #运行httpd服务
echo 'HelloContainer' > /var/www/html/index.html
systemctl enable --now httpd
...
[root@localhost ~]# docker load < centos8.tar
[root@localhost ~]# docker build /etc/docker/httpd -t my-httpd:apache -f /etc/docker/dockerfile #生成本地容器
[root@localhost ~]# docker run -d -p 80:80 --name=my-httpd my-httpd:apache #启动容器,并进项端口映射为80端口
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# docker ps #查看docke进程
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
903c44058853 my-httpd:apache "./1.sh" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, :::80->80/tcp my-httpd #容器启动成功
[root@docker apache]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# curl https://linux2.skills.com
HelloContainer
[root@localhost ~]#
第三种方法:
[root@localhost ~]# dnf -y install docker-ce
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# ls
anaconda-ks.cfg centos8.tar
[root@localhost ~]#
[root@localhost ~]# docker load < centos8.tar
74ddd0ec08fa: Loading layer [==================================================>] 238.6MB/238.6MB
Loaded image: centos:8
[root@localhost ~]#
[root@localhost ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 8 5d0da3dc9764 18 months ago 231MB
[root@localhost ~]#
[root@localhost ~]# docker run -d -itp 80:80 --privileged=true --name skills 5d0da3dc9764 /usr/sbin/init
e5e46f94f23dc5150a5fc6b146d7a9b45d397b84eb70098d9c97488184b24803
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5e46f94f23d 5d0da3dc9764 "/usr/sbin/init" 17 seconds ago Up 16 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp skills
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# docker exec -it skills bash
[root@e5e46f94f23d /]#
[root@e5e46f94f23d /]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
|-sda1 8:1 1G 0 part
|-sda2 8:2 0 19G 0 part
sr0 11:0 1 10G 0 rom
[root@e5e46f94f23d /]# mkdir /iso
[root@e5e46f94f23d /]# mount /dev/sr0 /iso/
mount: /iso: WARNING: device write-protected, mounted read-only.
[root@e5e46f94f23d /]# rm /etc/yum.repos.d/CentOS-Linux-* -rf
[root@e5e46f94f23d yum.repos.d]# vim centos.repo
...
[media-baseos]
name=CentOS Linux $releasever - Media - BaseOS
baseurl=file:///iso/BaseOS
gpgcheck=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
[media-appstream]
name=CentOS Linux $releasever - Media - AppStream
baseurl=file:///iso/AppStream
gpgcheck=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
...
[root@e5e46f94f23d yum.repos.d]# dnf makecache
[root@e5e46f94f23d yum.repos.d]#
[root@e5e46f94f23d yum.repos.d]# dnf -y install vim httpd
[root@e5e46f94f23d yum.repos.d]# echo "HelloContainer" > /var/www/html/index.html
[root@e5e46f94f23d yum.repos.d]# systemctl restart httpd
[root@e5e46f94f23d yum.repos.d]#
[root@e5e46f94f23d yum.repos.d]# exit
[root@localhost ~]# curl http://linux-2.skills.com
HelloContainer
[root@localhost ~]#