一、什么是docker容器?
容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会销毁。隔离的环境拥有自己的系统文件,ip地址,主机名、进程管理等
程序:代码,命令
进程:正在运行的程序
二、容器和虚拟化的区别
1、linux容器技术,容器虚拟化和kvm虚拟化的区别:
kvm虚拟化: 需要硬件的支持,需要模拟硬件,可以运行不同的操作系统,启动时间分钟级(开机启动流程)
2、linux开机启动流程:
- bios开机硬件自检
- 根据bios设置的优先启动项boot 网卡 硬盘 u盘 光驱
- 读取grub引导(mbr分区) 2T UEFI(gpt分区) mbr硬盘分区信息,内核加载路径
- 加载内核
- 启动第一个进程/sbin/init或systemd
- 系统初始化完成
- 运行服务 nginx
3、容器启动流程
- 共用宿主机内核
- 启动第一个进程,服务nginx,httpd,mysql等。
4、容器特点
优势:容器,共用宿主机linux内核,容器的第一个进程直接运行服务,轻量级,损耗少,启动快,性能高。
劣势:只支持linux,不支持其他系统。
5、kvm与docker区别
kvm:分钟级启动,占用磁盘空间大,网络延时大,资源隔离较好,支持多系统。
docker:秒启动,占用磁盘空间小,网络延时小,资源隔离较差,只支持linux系统。
三、容器技术的发展过程
1、chroot技术
改变根目录,新建一个子系统(拥有自己完整的系统文件)
2、linux容器(lxc)
linux container(namespaces 命名空间,隔离环境及cgroups 进程资源限制)
cgroups :限制一个进程能够使用的硬件资源。cpu,内存,硬盘io等。
四、容器lxc创建
1、安装epel源
yum install epel-release -y
2、编译epel源配置文件
vi /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch/debug
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/SRPMS
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
3、安装lxc
yum install lxc-* -y
yum install libcgroup* -y
yum install bridge-utils.x86_64 -y
4、桥接网卡
[root@controller ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
echo 'TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=virbr0' >/etc/sysconfig/network-scripts/ifcfg-eth0
[root@controller ~]# cat /etc/sysconfig/network-scripts/ifcfg-virbr0
echo 'TYPE=Bridge
BOOTPROTO=static
NAME=virbr0
DEVICE=virbr0
ONBOOT=yes
IPADDR=10.0.0.11
NETMASK=255.255.255.0
GATEWAY=10.0.0.254
DNS1=180.76.76.76' >/etc/sysconfig/network-scripts/ifcfg-virbr0
5、启动cgroup
systemctl start cgconfig.service
6、启动lxc
systemctl start lxc.service
7、创建lxc容器
方法1:
lxc-create -t download -n centos6 -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images -d centos -r 6 -a amd64
方法2:
lxc-create -t centos -n test
8、为lxc容器设置root密码
[root@controller ~]# chroot /var/lib/lxc/test/rootfs passwd
Changing password for user root.
New password:
BAD PASSWORD: it is too simplistic/systematic
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.
9、为容器指定ip和网关
vi /var/lib/lxc/centos7/config
lxc.network.name = eth0
lxc.network.ipv4 = 10.0.0.111/24
lxc.network.ipv4.gateway = 10.0.0.254
10、启动容器
lxc-start -n centos7
五、Docker容器安装
1、更改主机IP地址
10.0.0.11:修改主机名和host解析
2、删除之前默认的yum源
rm -fr /etc/yum.repos.d/local.repo
3、配置阿里云yum源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
4、下载安装docker
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
yum install docker-ce -y
小提示:docker分两个版本,一个是ce社区版Community Edition,另一个是ee企业版Enterprise Edition。
六、检查启动docker
[root@doceker01 yum.repos.d]# docker version
Client:
Version: 18.09.7
API version: 1.39
Go version: go1.10.8
Git commit: 2d0083d
Built: Thu Jun 27 17:56:06 2019
OS/Arch: linux/amd64
Experimental: false
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
[root@doceker01 yum.repos.d]# systemctl start docker
[root@doceker01 yum.repos.d]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@doceker01 yum.repos.d]# docker version
Client:
Version: 18.09.7
API version: 1.39
Go version: go1.10.8
Git commit: 2d0083d
Built: Thu Jun 27 17:56:06 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.7
API version: 1.39 (minimum version 1.12)
Go version: go1.10.8
Git commit: 2d0083d
Built: Thu Jun 27 17:26:28 2019
OS/Arch: linux/amd64
Experimental: false
七、docker系统命令
查看系统信息
docker system info
查看进程信息
docker system events
查看磁盘情况
docker system df
删除所有容器,清除
docker system prune
查看镜像列表
docker images docker image ls
删除镜像
docker image rm centos:latest
导出镜像
docker image save centos > docker-centos7.4.tar.gz
或
docker image save -o docker_nginx.tar.gz nginx:latest
导入镜像
docker load 例子:docker image load -i docker-centos7.4.tar.gz
八、docker主要组件
镜像、容器、仓库, 网络,存储
镜像:做好的系统
容器:链接镜像系统文件
仓库:纯镜像
九、启动第一个容器
1、配置源
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
2、启动docker
systemctl restart docker
3、下载镜像
docker run -d -p 80:80 nginx
run(创建并运行一个容器)
-d 放在后台
-p 端口映射
nginx docker镜像的名字
4、docker的镜像管理
搜索镜像
docker search
选镜像的建议:
1,优先考虑官方
2,stars数量多
5、下载镜像
docker pull(push)默认下载最新版本
镜像加速器:阿里云加速器,daocloud加速器,中科大加速器,Docker 中国官方镜像加速:https://registry.docker-cn.com
官方pull docker pull centos:6.8(没有指定版本,默认会下载最新版)
私有仓库pull docker pull daocloud.io/huangzhichong/alpine-cn:latest
6、docker的容器管理
docker run -d -p 80:80 nginx:latest
run(创建并运行一个容器)
-d 放在后台
-p 端口映射
-v 源地址(宿主机):目标地址(容器)
nginx docker镜像的名字
docker run -it --name centos6 centos:6.9 /bin/bash
-it 分配交互式的终端
--name 指定容器的名字
/bin/sh覆盖容器的初始命令
十、启动关闭查询容器
启动容器
docker run image_name
docker run -it image_name CMD
docker run ==== docker create + docker start
停止容器
docker stop CONTAINER_ID
杀死容器
docker kill container_name
查看容器列表
docker ps
docker ps –a
十一、容器相关操作实验
目的:调试和排错
1、进入容器
[root@doceker01 ~]# docker run -it centos:6.9
docker attach(使用同一个终端)
docker attach [OPTIONS] CONTAINER
使用ctrl + p,ctrl + q,可查看历史命令
[root@doceker01 ~]# docker container attach b553a8e556dc
退出后历史命令消失
docker exec (会分配一个新的终端tty
docker exec [OPTIONS] CONTAINER COMMAND [ARG...])
2、删除容器
删除容器
docker rm
[root@doceker01 ~]# docker container rm +容器名称
批量删除容器
docker rm -f docker ps -a -q
小提示:docker容器内的第一个进程(初始命令)必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出状态!
3、端口映射
[root@doceker01 ~]# docker run -p 1080:80 -d nginx:latest
指定映射(docker 会自动添加一条iptables规则来实现端口映射)
-p hostPort:containerPort
-p ip:hostPort:containerPort 多个容器都想使用80端口
-p ip::containerPort(随机端口)
-p hostPort:containerPort:udp
-p 10.0.0.100::53:udp
-p 81:80 –p 443:443 可以指定多个-p
随机映射
docker run -P (随机端口)
通过iptables来实现的端口映射
4、手动制作镜像
docker commit 容器id或者容器的名字 新的镜像名字[:版本号可选]
1):基于容器制作镜像
docker run -it centos:6.9
yum install httpd
yum install openssh-server
/etc/init.d/sshd start
vi /init.sh
!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
chmod +x /init.sh
2)将容器提交为镜像
docker commit oldboy centos6-ssh-httpd:v1
3)测试镜像功能是否可用
手动制作的镜像,传输时间长
镜像初始命令
制作一个kodexplorer网盘docker镜像。nginx + php-fpm(httpd + php)
第一步:启动一个容器,并在容器中安装好软件。第二步:把安装好软件的容器提交为镜像。第三步:测试镜像能不能夯住和服务是否正常启动。
[root@doceker01 ~]# docker container commit b66dc34e7d95 centos6.9_ssh:v1
sha256:b6e7ff54c44526f249a7e5a40ed47bef6e3206c524b4b663b201fe69da8ffda6
[root@doceker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos6.9_ssh v1 b6e7ff54c445 11 seconds ago 307MB
busybox latest e4db68de4ff2 2 weeks ago 1.22MB
nginx latest 719cd2e3ed04 2 weeks ago 109MB
centos 6.9 adf829198a7f 10 months ago 195MB
daocloud.io/huangzhichong/alpine-cn latest e8289dcc1d4b 2 years ago 3.98MB