容器简介
什么是 Linux 容器
Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件,镜像包含了应用的所有依赖项。
容器是虚拟化吗
是,但不完全是。
虚拟化使得许多操作系统可同时在单个系统上运行。容器则可共享同一个操作系统内核,将应用进程与系统其他部分隔离开。
什么是 Docker?
IT 软件中所说的 “Docker” ,是指容器化技术,用于支持创建和使用 Linux 容器。
Docker 如何工作?
Docker 技术使用 Linux 内核和内核功能(例如 Cgroups 和 namespaces)来分隔进程,以便各进程相互独立运行。容器工具(包括 Docker)可提供基于镜像的部署模式。Docker 可在这一容器环境中自动部署应用程序(或者合并多种流程,以构建单个应用程序)。
Docker 技术是否与传统的 Linux 容器相同?
否。Docker 技术最初是基于 LXC 技术构建(大多数人都会将这一技术与“传统的” Linux 容器联系在一起),但后来它逐渐摆脱了对这种技术的依赖。除了运行容器之外,Docker 技术还具备其他多项功能,包括简化用于构建容器、传输镜像以及控制镜像版本的流程。
传统的 Linux 容器使用 init 系统来管理多种进程。Docker 技术鼓励应用程序各自独立运行其进程,并提供相应工具以实现这一功能。
docker的目标
docker的主要目标是"Build,Ship and Run any App,Anywhere",构建,运输,处处运行
构建:做一个docker镜像
运输:docker pull
运行:启动一个容器
每一个容器,他都有自己的文件系统rootfs.
docker的生命周期
dcoker 安装及镜像加速
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce -y
yum install -y bash-completion #命令补全扩展
mkdir /etc/docker/
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://uwtinn28.mirror.aliyuncs.com"]
}
EOF
cat /etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
Docker基础命令操作
查看docker相关信息
[root@docker01 ~]# docker version
Client:
Version: 17.12.0-ce
API version: 1.35
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 2720:10:142017
OS/Arch: linux/amd64
Server:
Engine:
Version: 17.12.0-ce
API version: 1.35 (minimum version 1.12)
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 2720:12:462017
OS/Arch: linux/amd64
Experimental: false
搜索官方仓库镜像
[root@docker01 ~]# docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 3992 [OK]
ansible/centos7-ansible Ansible on Centos7 105
列表说明
参数 | 说明 |
---|---|
NAME | 镜像名称 |
DESCRIPTION | 镜像说明 |
STARS | 点赞数量 |
OFFICIAL | 是否是官方的 |
AUTOMATED | 是否是自动构建的 |
获取镜像
据镜像名称拉取镜像
[root@docker01 ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
af4b0a2388c6: Downloading 34.65MB/73.67MB
拉第三方镜像
docker pull index.tenxcloud.com/tenxcloud/httpd
导出镜像
# 查看当前主机镜像列表
[root@docker01 ~]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest ff426288ea90 3 weeks ago 207MB
nginx latest 3f8a4339aadd 5 weeks ago 108MB
# 导出
[root@docker01 ~]# docker image save centos > docker-centos.tar.gz
导入镜像
[root@docker01 ~]# docker image load -i docker-centos.tar.gz
e15afa4858b6: Loading layer 215.8MB/215.8MB
Loaded image: centos:latest
[root@docker01 ~]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest ff426288ea90 3 weeks ago 207MB
nginx latest 3f8a4339aadd 5 weeks ago 108MB
查看镜像的详细信息
[root@docker01 ~]# docker image inspect nginx
[
{
"Id": "sha256:f7bb5701a33c0e572ed06ca554edca1bee96cbbc1f76f3b01c985de7e19d0657",
"RepoTags": [
"nginx:latest"
],
"RepoDigests": [],
......
container的管理
容器的起/停
快速启动容器
[root@docker01 ~]# docker run centos:latest /usr/bin/sleep 20;
容器内的第一个进程必须一直处于运行的状态,否则这个容器,就会处于退出状态!
查看容器
# 查看正在运行的容器
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8708e93fd767 nginx "nginx -g 'daemon of…"6 seconds ago Up 4 seconds 80/tcp keen_lewin
#查看所有容器
root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8708e93fd767 nginx "nginx -g 'daemon of…"4minutes ago Exited (0) 59 seconds ago keen_lewin
f9f3e6af7508 nginx "nginx -g 'daemon of…" 5 minutes ago Exited (0) 5 minutes ago optimistic_haibt
查看容器详细信息/ip
[root@docker01 ~]# docker container inspect 容器名称/id
停止容器
[root@docker01 ~]# docker stop 容器名称/id
或
[root@docker01 ~]# docker container kill 容器名称/id
进入容器
启动时进入
[root@docker01 ~]# docker run -it nginx:latest /bin/bash
root@79241093859e:/#
启动后进入
# attach进入容器,使用pts/0 ,会让所用通过此方法进如放入用户看到同样的操作。
[root@docker01 ~]# docker attach 1bf0f43c4d2f
[root@1bf0f43c4d2f /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 10015:47 pts/000:00:00 /bin/bash
root 141015:49 pts/000:00:00 ps -ef
# exrc 进入容器方法(推荐使用)
root@docker01 ~]# docker exec -it clsn1 /bin/bash
[root@b20fa75b4b40 /]# 重新分配一个终端
[root@b20fa75b4b40 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 10016:11 pts/000:00:00 /bin/bash
root 130016:14 pts/100:00:00 /bin/bash
root 2613016:14 pts/100:00:00 ps -ef
端口映射
root@docker01 ~]# docker run -d -p 8888:80 nginx:latest
287bec5c60263166c03e1fc5b0b8262fe76507be3dfae4ce5cd2ee2d1e8a89a
不同指定映射方法
参数 | 说明 |
---|---|
-p hostPort:containerPort | 端口映射 -p 8080:80 |
-p ip:hostPort:containerPort | 配置监听地址 -p 10.0.0.100:8080:80 |
-p ip::containerPort | 随机分配端口 -p 10.0.0.100::80 |
-p hostPort:containerPort:udp | 指定协议 -p 8080:80:tcp |
-p 81:80 –p 443:443 | 指定多个 |
Docker 数据卷的管理
挂载时创建卷
[root@docker01 ~]# docker run -d -p 80:80 -v /data:/usr/share/nginx/html nginx:latest
079786c1e297b5c5031e7a841160c74e91d4ad06516505043c60dbb78a259d09
# 查看卷
[root@docker01 ~]# docker volume ls
DRIVER VOLUME NAME
local 1ed7846636ce11c88836e7d0cc66fc9858869b7aec1d89547b6220fa1b7303c3
创建卷后挂载
# 指定卷名创建卷
[root@docker01 ~]# docker volume create clsn
clsn
[root@docker01 ~]# docker volume inspect clsn
[
{
"CreatedAt": "2021-09-10T12:40:51+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/clsn/_data",
"Name": "clsn",
"Options": {},
"Scope": "local"
}
]
# 使用卷创建
[root@docker01 ~]# docker run -d -p 9000:80 -v clsn:/usr/share/nginx/html nginx:latest
1434559cff996162da7ce71820ed8f5937fb7c02113bbc84e965845c219d3503
# 宿主机测试
[root@docker01 ~]# echo 'blog.nmtui.com' >/var/lib/docker/volumes/clsn/_data/index.html
[root@docker01 ~]# curl 10.0.0.100:9000
blog.nmtui.com
将容器保存为镜像
[root@docker01 ~]# docker run -it -p 1022:22 centos:6.8 /bin/bash
# 在容器种安装sshd服务,并修改系统密码
[root@582051b2b92b ~]# yum install openssh-server -y
[root@582051b2b92b ~]# echo "root:123456" |chpasswd
[root@582051b2b92b ~]# /etc/init.d/sshd start
将容器提交为镜像
[root@docker01 ~]# docker commit brave_mcclintock centos6-ssh
Dockerfile
Dockerfile指令集
dockerfile常用指令:
FROM (指定基础镜像)
MAINTAINER (指定维护者信息,可以没有)
RUN (在命令前面加上RUN即可)
ADD (COPY文件,会自动解压)
WORKDIR (设置当前工作目录)
VOLUME (设置卷,挂载主机目录)
EXPOSE (指定对外的端口)
CMD (指定容器启动后的要干的事情)
COPY 复制文件
ENV 环境变量
ENTRYPOINT 容器启动后执行的命令
创建一个Dockerfile文件
FROM centos:6.8
RUN yum install openssh-server -y
RUN echo "root:123456" |chpasswd
RUN /etc/init.d/sshd start
CMD ["/usr/sbin/sshd","-D"]
构建docker镜像
[root@docker01 base]# docker image build -t centos6.8-ssh .
-t 为镜像标签打标签 . 表示当前路径
Dcokerfile安装kodexplorer
FROM centos:6.8
RUN yum install wget unzip php php-gd php-mbstring -y && yum clean all
# 设置工作目录,之后的操作都在这个目录中
WORKDIR /var/www/html/
RUN wget -c http://static.kodcloud.com/update/download/kodexplorer4.25.zip
RUN unzip kodexplorer4.25.zip && rm -f kodexplorer4.25.zip
RUN chown -R apache.apache .
CMD ["/usr/sbin/apachectl","-D","FOREGROUND"]
docker 仓库
创建一个普通仓库
1、创建仓库
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
2、修改配置文件,使之支持http
[root@docker01 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.100:5000"]
}
重启docker让修改生效
[root@docker01 ~]# systemctl restart docker.service
3、修改镜像标签
[root@docker01 ~]# docker tag busybox:latest 10.0.0.100:5000/clsn/busybox:1.0
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos6-ssh latest 3c2b1e57a0f5 18 hours ago 393MB
httpd 2.42e202f453940 6 days ago 179MB
10.0.0.100:5000/clsn/busybox 1.05b0d59026729 8 days ago 1.15MB
4、将新打标签的镜像上传镜像到仓库
[root@docker01 ~]# docker push 10.0.0.100:5000/clsn/busybox
带basic认证的仓库
1、安装加密工具
[root@docker01 clsn]# yum install httpd-tools -y
2、设置认证密码
mkdir /opt/registry-var/auth/ -p
htpasswd \-Bbn clsn 123456 > /opt/registry-var/auth/htpasswd
3、启动容器,在启动时传入认证参数
docker run -d -p 5000:5000 -v /opt/registry-var/auth/:/auth/ -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry
4、使用验证用户测试
# 登陆用户
[root@docker01 ~]# docker login 10.0.0.100:5000
Username: clsn
Password: 123456
Login Succeeded
# 推送镜像到仓库
[root@docker01 ~]# docker push 10.0.0.100:5000/clsn/busybox
The push refers to repository [10.0.0.100:5000/clsn/busybox]
4febd3792a1f: Pushed
1.0: digest: sha256:4cee1979ba0bf7db9fc5d28fb7b798ca69ae95a47c5fecf46327720df4ff352d size: 527
#认证文件的保存位置
[root@docker01 ~]# cat .docker/config.json
{
"auths": {
"10.0.0.100:5000": {
"auth": "Y2xzbjoxMjM0NTY="
},
"https://index.docker.io/v1/": {
"auth": "Y2xzbjpIenNAMTk5Ng=="
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/17.12.0-ce (linux)"
}
}