Docker 1.0(入门篇)

image

1. Docker简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

1.1 基本组成

Docker 中有非常重要的三个基本概念,理解了这三个概念,就理解了 Docker 的整个生命周期。

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

1.2 帮助文档

https://docs.docker.com/
image

2. Docker的安装

2.1 环境准备:

我这里使用一台阿里云的服务器(CentOS-7)

命令:

uname -r            #查看系统内核版本
cat /etc/os-release #查看系统信息

示例:

[root@flamingo ~]# uname -r
3.10.0-1127.19.1.el7.x86_64
[root@flamingo ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

2.2 卸载旧版本:

旧版本的 Docker 被称为docker或docker-engine. 如果安装了这些,请卸载它们以及相关的依赖项

命令:

 sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

实例:

[root@flamingo ~]#  sudo yum remove docker \
>                   docker-client \
>                   docker-client-latest \
>                   docker-common \
>                   docker-latest \
>                   docker-latest-logrotate \
>                   docker-logrotate \
>                   docker-engine
Loaded plugins: fastestmirror
No Match for argument: docker
No Match for argument: docker-client
No Match for argument: docker-client-latest
No Match for argument: docker-common
No Match for argument: docker-latest
No Match for argument: docker-latest-logrotate
No Match for argument: docker-logrotate
No Match for argument: docker-engine
No Packages marked for removal

2.3 安装依赖

yum install -y yum-utils

2.4 设置镜像仓库

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo  #国外的地址

    # 设置阿里云的Docker镜像仓库
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2.5 更新yum软件包

yum makecache fast

2.6 配置阿里云镜像加速

进去阿里云官网,搜索-容器镜像服务>镜像工具>镜像加速器:

image

在服务器上设置:

# 购买服务器都会给的有,每个人的都不相同,仅自己服务器使用
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://6rbao01n.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

2.7 下载docker

yum install docker-ce docker-ce-cli containerd.io   # 安装社区版
yum install docker-ee docker-ee-cli containerd.io   # 安装企业版

一般情况下安装社区版
image

2.8 启动Docker

命令:

systemctl start docker   # 启动Docker
docker version           # 查看当前版本号,是否启动成功
systemctl enable docker  # 设置开机自启动

示例:
image

2.9 Docker的卸载

yum remove docker-ce docker-ce-cli containerd.io  # 卸载依赖
rm -rf /var/lib/docker    # 删除资源  . /var/lib/docker是docker的默认工作路径

3. Docker实践

3.1 HelloWorld

docker run hello-world

示例:

[root@flamingo ~]# docker run hello-world         # 运行hello-world
Unable to find image 'hello-world:latest' locally # 本地没有找到镜像
latest: Pulling from library/hello-world          # 从库中拉取
2db29710123e: Pull complete
Digest: sha256:bfea6278a0a267fad2634554f4f0c6f31981eea41c553fdf5a83e95a41d40c38
Status: Downloaded newer image for hello-world:latest

Hello from Docker!      # 成功运行
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

3.2 运行centos容器

docker pull centos                # 拉取镜像
docker run -it centos /bin/bash   # 运行容器  -it 交互模式

示例:

[root@flamingo ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

[root@flamingo ~]# docker run -it centos /bin/bash
[root@6106df527758 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

4. Docker常用命令

4.1 基础命令

docker version          #查看docker的版本信息
docker info             #查看docker的系统信息,包括镜像和容器的数量
docker 命令 --help       #帮助命令(可查看可选的参数)
docker COMMAND --help

命令的帮助文档地址: https://docs.docker.com/engine/reference/commandline/docker/

4.2 镜像命令

查看镜像:

docker images # 查看本地主机的所有镜像
示例:
[root@flamingo ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   6 months ago   13.3kB
centos        latest    5d0da3dc9764   6 months ago   231MB

1.REPOSITORY  镜像的仓库源
2.TAG  镜像的标签
3.IMAGE ID 镜像的id
4.CREATED 镜像的创建时间
5.SIZE 镜像的大小
# 可选参数
-a/--all 列出所有镜像
-q/--quiet 只显示镜像的id

搜索镜像:

docker search 镜像名  # 搜索相应的镜像文件
示例:
[root@flamingo ~]# docker search mysql
NAME                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                            MySQL is a widely used, open-source relation…   12306     [OK]
mariadb                          MariaDB Server is a high performing open sou…   4734      [OK]
mysql/mysql-server               Optimized MySQL Server Docker images. Create…   913             
percona                          Percona Server is a fork of the MySQL relati…   572       [OK]
phpmyadmin                       phpMyAdmin - A web interface for MySQL and M…   481       [OK]
mysql/mysql-cluster              Experimental MySQL Cluster Docker images. Cr…   93
centos/mysql-57-centos7          MySQL 5.7 SQL database server                   92
bitnami/mysql                    Bitnami MySQL Docker Image                      67             

可选项:
--filter=STARS=3000  #搜索收藏数大于3000的镜像

拉取镜像:

docker pull 镜像名  # 拉取相应的镜像
示例:
[root@flamingo ~]# docker pull mysql
Using default tag: latest             #如果不写tag默认就是latest
latest: Pulling from library/mysql  
72a69066d2fe: Pull complete           #分层下载,docker image的核心-联合文件系统
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
688ba7d5c01a: Pull complete
00e060b6d11d: Pull complete
1c04857f594f: Pull complete
4d7cfa90e6ea: Pull complete
e0431212d27d: Pull complete
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest     #下载来源的真实地址  #docker pull mysql等价于docker pull docker.io/library/mysql:latest

docker pull mysql[:tag]   # 指定版本下载
示例:
docker pull mysql:5.7
`tag`一定要在docker-hub中存在

image

删除镜像:

#1.删除指定的镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f  镜像id
#2.删除多个镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f  镜像id 镜像id 镜像id
#3.删除全部的镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f  $(docker images -aq)

4.3 容器命令

运行容器:

docker run [可选参数] image

#参数说明
--name="名字"          # 指定容器名字
-d                     # 后台方式运行
-it                    # 使用交互方式运行,进入容器查看内容
-p                     # 指定容器的端口
{
-p ip:主机端口:容器端口 # 配置主机端口映射到容器端口
-p 主机端口:容器端口
-p 容器端口
-P                     # 随机指定端口(大写的P)
}

示例:

运行并进入容器centos

[root@flamingo ~]# docker run -it centos /bin/bash
[root@4564e6cc011e /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

退出容器:

exit      # 停止并退出容器(后台方式运行则仅退出)
Ctrl+P+Q  # 不停止容器退出

列出容器:

docker ps  # 列出当前正在运行的容器
参数:
-a   # 列出所有容器的运行记录
-n=? # 显示最近创建的n个容器
-q   # 只显示容器的编号

示例:

[root@flamingo ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
81696953bd1e   centos    "/bin/bash"   31 seconds ago   Up 30 seconds             gifted_rosalind
[root@flamingo ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED             STATUS                         PORTS     NAMES
81696953bd1e   centos         "/bin/bash"   33 seconds ago      Up 32 seconds                            gifted_rosalind
4564e6cc011e   centos         "/bin/bash"   4 minutes ago       Exited (0) 2 minutes ago                 relaxed_rosalind
6106df527758   centos         "/bin/bash"   About an hour ago   Exited (1) 42 minutes ago                priceless_haibt
f287c079ec37   feb5d9fea6a5   "/hello"      About an hour ago   Exited (0) About an hour ago             friendly_wilson
7a3ef9da95ac   hello-world    "/hello"      2 hours ago         Exited (0) 2 hours ago                   happy_kepler
c6374a6122f3   hello-world    "/hello"      2 hours ago         Exited (0) 2 hours ago                   naughty_sammet

删除容器:

docker rm 容器id                  # 删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f
docker rm -f $(docker ps -aq)     # 删除所有的容器
docker ps -a -q|xargs docker rm   # 删除所有的容器

启动和停止容器:

docker start 容器id          #启动容器
docker restart 容器id        #重启容器
docker stop 容器id           #停止当前运行的容器
docker kill 容器id           #强制停止当前容器

2022-3-25 22:27

4.4 其他命令

查看容器日志:

docker logs --help   
示例:
[root@flamingo ~]# docker logs --help

Usage:  docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

Options:
      --details        Show extra details provided to logs
  -f, --follow         Follow log output
      --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
  -n, --tail string    Number of lines to show from the end of the logs (default "all")
  -t, --timestamps     Show timestamps
      --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)

常用:
docker logs -tf 容器id
docker logs --tail number 容器id #num为要显示的日志条数

查看容器中进程信息:

[root@flamingo ~]# docker top 9fd26d483ed5 
UID                 PID                 PPID                C                   STIME               TTY                 TIME                          CMD
root                32108               32089               0                   10:28               pts/0               00:00:00                      /bin/bash
root                32164               32089               0                   10:28               ?                   00:00:00                      /bin/bash

查看容器的元数据:

docker inspect 容器id
示例:
[root@flamingo ~]# docker inspect 9fd26d483ed5
[
    {
        "Id": "9fd26d483ed55ab7414cda953bf0f977b4b01df359504661f1820a316c91c859",
        "Created": "2022-03-25T14:54:12.312672252Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 32108,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2022-03-26T02:28:28.42231243Z",
            "FinishedAt": "2022-03-25T14:55:13.54192648Z"
        },

进入当前运行的容器:

docker exec   # 进入容器后开启一个新的终端,可以在里面操作,(exit不会关闭容器)
docker attach # 进入容器正在执行的终端,不会启动新的进程

示例:
1. `docker exec -it 容器id /bin/bash`

[root@flamingo ~]# docker exec -it 9fd26d483ed5 /bin/bash
[root@9fd26d483ed5 /]#

2. `docker attach 容器id`

[root@flamingo ~]# docker attach 9fd26d483ed5
[root@9fd26d483ed5 /]#

拷贝命令:

#拷贝容器的文件到主机中
docker cp 容器id:容器内路径  目的主机路径

#拷贝宿主机的文件到容器中 (和容器的状态无关,未运行也可以拷贝)
docker cp 目的主机路径 容器id:容器内路径

示例:
将主机中的a.txt文件拷贝到 centos 容器的tmp目录下
[root@flamingo ~]# docker cp ./a.txt 9fd26d483ed5:/tmp/

将容器中的test.sh文件拷贝到主机当前目录
[root@flamingo ~]# docker cp 9fd26d483ed5:/root/test.sh ./

4.5 命令总结:

attach    Attach to a running container  #当前shell下attach连接指定运行镜像
build     Build an image from a Dockerfile  #通过Dockerfile定制镜像
commit    Create a new image from a container's changes  #提交当前容器为新的镜像
cp        Copy files/folders from a container to a HOSTDIR or to STDOUT  #从容器中拷贝指定文件或者目录到宿主机中
create    Create a new container  #创建一个新的容器,同run 但不启动容器
diff      Inspect changes on a container's filesystem  #查看docker容器变化
events    Get real time events from the server#从docker服务获取容器实时事件
exec      Run a command in a running container#在已存在的容器上运行命令
export    Export a container's filesystem as a tar archive  #导出容器的内容流作为一个tar归档文件(对应import)
history   Show the history of an image  #展示一个镜像形成历史
images    List images  #列出系统当前镜像
import    Import the contents from a tarball to create a filesystem image  #从tar包中的内容创建一个新的文件系统映像(对应export)
info      Display system-wide information  #显示系统相关信息
inspect   Return low-level information on a container or image  #查看容器详细信息
kill      Kill a running container  #kill指定docker容器
load      Load an image from a tar archive or STDIN  #从一个tar包中加载一个镜像(对应save)
login     Register or log in to a Docker registry#注册或者登陆一个docker源服务器
logout    Log out from a Docker registry  #从当前Docker registry退出
logs      Fetch the logs of a container  #输出当前容器日志信息
pause     Pause all processes within a container#暂停容器
port      List port mappings or a specific mapping for the CONTAINER  #查看映射端口对应的容器内部源端口
ps        List containers  #列出容器列表
pull      Pull an image or a repository from a registry  #从docker镜像源服务器拉取指定镜像或者库镜像
push      Push an image or a repository to a registry  #推送指定镜像或者库镜像至docker源服务器
rename    Rename a container  #重命名容器
restart   Restart a running container  #重启运行的容器
rm        Remove one or more containers  #移除一个或者多个容器
rmi       Remove one or more images  #移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者-f强制删除)
run       Run a command in a new container  #创建一个新的容器并运行一个命令
save      Save an image(s) to a tar archive#保存一个镜像为一个tar包(对应load)
search    Search the Docker Hub for images  #在docker-hub中搜索镜像
start     Start one or more stopped containers#启动容器
stats     Display a live stream of container(s) resource usage statistics  #统计容器使用资源
stop      Stop a running container  #停止容器
tag       Tag an image into a repository  #给源中镜像打标签
top       Display the running processes of a container #查看容器中运行的进程信息
unpause   Unpause all processes within a container  #取消暂停容器
version   Show the Docker version information#查看容器版本号
wait      Block until a container stops, then print its exit code  #截取容器停止时的退出状态值

5. Docker可视化管理

主要有三种可视化工具:

  • dockerUI
  • portainer
  • portainer

portainer工具的使:

[root@flamingo ~]# docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

Unable to find image 'portainer/portainer:latest' locally
latest: Pulling from portainer/portainer
94cfa856b2b1: Pull complete
49d59ee0881a: Pull complete
a2300fd28637: Pull complete
Digest: sha256:fb45b43738646048a0a0cc74fcee2865b69efde857e710126084ee5de9be0f3f
Status: Downloaded newer image for portainer/portainer:latest
1e4a4f2ac1a118af850abc8bfea229252bca5207fa4afb6fadf848ab7ea81926

直接访问主机相应的服务端口: http://116.62.141.109:8088/
image

image

image

6. 常见容器的部署

6.1 Nginx

docker search nginx  # 查找
docker pull nginx    # 下载
docker run -d --name nginx -p 9000:80 nginx   # 启动

# 备注
-d 后台运行
--name 给容器命名
-p 9000:80 将宿主机的端口9000映射到该容器的80端口

示例:
[root@flamingo ~]# docker search nginx
[root@flamingo ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

[root@flamingo ~]# docker run -d --name=nginx -p 8080:80 nginx

访问nginx服务:http://116.62.141.109:8080/

image

6.2 Tomcat

docker search tomcat     # 寻找镜像
docker pull tomcat 		 # 拉取镜像
docker run -d --name=tomcat -p 8000:8080 tomcat  # 启动容器 

示例:
[root@flamingo ~]# docker search tomcat
[root@flamingo ~]# docker pull tomcat:9.0
9.0: Pulling from library/tomcat
0e29546d541c: Pull complete
9b829c73b52b: Pull complete
cb5b7ae36172: Pull complete
6494e4811622: Pull complete
668f6fcc5fa5: Pull complete
dc120c3e0290: Pull complete
8f7c0eebb7b1: Pull complete
77b694f83996: Pull complete
7662046c36cb: Pull complete
b93639122cb4: Pull complete
Digest: sha256:cd96d4f7d3f5fc4d3bc1622ec678207087b8215d55021a607ecaefba80b403ea
Status: Downloaded newer image for tomcat:9.0
docker.io/library/tomcat:9.0

[root@flamingo ~]# docker run -d --name tomacat -p 8000:8080 tomcat:9.0
06fdc4abc2db1e255ecb217b825a2b1ba3772a2373b0059a821dce42a695bec9

通过浏览器访问tomcat服务:http://116.62.141.109:8000/

image

扩展:
正常访问tomcat是可以看见他的logo界面。到那时在容器中tomcat是"青春版",不过通过相应的设置也能访问到logo界面:

[root@flamingo ~]# docker exec -it tomacat /bin/bash
root@06fdc4abc2db:~# cd /usr/local/tomcat/
root@06fdc4abc2db:/usr/local/tomcat# cp -r ./webapps.dist/*  ./webapps/

再次访问:http://116.62.141.109:8000/ 就可以看见tomcat logo界面。

image

掌握了以上基本操作,可以继续学习Docker(进阶篇)

posted @ 2022-03-25 22:29  Satoris  阅读(45)  评论(0)    收藏  举报