一文总结docker

容器简介

什么是 Linux 容器

Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件,镜像包含了应用的所有依赖项。

容器是虚拟化吗

是,但不完全是。

虚拟化使得许多操作系统可同时在单个系统上运行。容器则可共享同一个操作系统内核,将应用进程与系统其他部分隔离开。


image-20210910112009666.png

什么是 Docker?

IT 软件中所说的 “Docker” ,是指容器化技术,用于支持创建和使用 Linux 容器。

Docker 如何工作

Docker 技术使用 Linux 内核和内核功能(例如 Cgroupsnamespaces)来分隔进程,以便各进程相互独立运行。容器工具(包括 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的生命周期

image-20210910113532989.png

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)"
    }
}

docker-compose

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容