Docker安装

centos 上检测是否安装过docker。使用yum命令卸载centos上的旧版的docker版本

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

设置存储库

安装yum-utils软件包(提供yum-config-manager 实用程序)并设置稳定的存储库

yum install -y yum-utils

# 使用阿里云镜像进行docker配置
yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装DOCKER引擎

安装最新版本的Docker Engine和容器

yum install docker-ce docker-ce-cli containerd.io

# docker 选择版本安装

# 使用命令列出docker的可用的储存库
yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64  3:18.09.1-3.el7                     docker-ce-stable
docker-ce.x86_64  3:18.09.0-3.el7                     docker-ce-stable
docker-ce.x86_64  18.06.1.ce-3.el7                    docker-ce-stable
docker-ce.x86_64  18.06.0.ce-3.el7                    docker-ce-stable

# 选择版本安装
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

image-20210330110615887

启动Docker

systemctl start docker

通过运行hello-world 映像来验证是否正确安装了Docker Engine 。

docker run hello-world

卸载Docker

# 卸载Docker Engine,CLI和Containerd软件包
yum remove docker-ce docker-ce-cli containerd.io


#主机上的映像,容器,卷或自定义配置文件不会自动删除。要删除所有图像,容器和卷
rm -rf /var/lib/docker

阿里云镜像加速

# 配置镜像加速器

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://rpa8o742.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload

systemctl restart docker

底层原理


Docker是怎么工作的

Docker是一个Client——Server的结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端进行访问。

DockerServer接收到Docker-Client的指令,就会执行这个命令!!

docker为什么比VM快?

1、Docker有比虚拟机更少的抽象层

2、Docker使用的是宿主机的内核,VM使用的是Guest OS.

image-20210330110650135

Docker 的常用命令

帮助命令

docker version # 看版本的命令
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help # docker的帮助命令

帮助文档的地址 https://docs.docker.com/reference/

镜像命令

docker images 查看本地主机上的所有镜像

[root@192 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
mysql        latest    a347a5928046   5 days ago    545MB
centos       latest    300e315adb2f   2 weeks ago   209MB

# 解释
REPOSITORY 镜像的仓库源
TAG        镜像的标签
IMAGE ID   镜像的id
CREATED    镜像的创建时间
SIZE       镜像的大小

#可选项

Options:
  -a, --all            # 列出所有镜像
 
  -q, --quiet          # 显示镜像的id

docker search 搜索镜像

[root@192 ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10312     [OK]       
mariadb                           MariaDB is a community-developed fork of MyS…   3822      [OK]       


# 可选项
--filter=stars=3000


docker pull 命令 下载镜像

# 下载镜像
[root@192 ~]# docker pull mysql
Using default tag: latest

docker rmi 命令 删除镜像

docker images

REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
test1                     latest              fd484f19954f        23 seconds ago      7 B (virtual 4.964 MB)
test                      latest              fd484f19954f        23 seconds ago      7 B (virtual 4.964 MB)
test2                     latest              fd484f19954f        23 seconds ago      7 B (virtual 4.964 MB)

$ docker rmi fd484f19954f

Error: Conflict, cannot delete image fd484f19954f because it is tagged in multiple repositories, use -f to force
2013/12/11 05:47:16 Error: failed to remove one or more images

$ docker rmi test1:latest

Untagged: test1:latest

$ docker rmi test2:latest

Untagged: test2:latest


$ docker images

REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
test                      latest              fd484f19954f        23 seconds ago      7 B (virtual 4.964 MB)

$ docker rmi test:latest

Untagged: test:latest
Deleted: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8

容器命令

有了镜像才可以创建容器,Linux,下载一个centos来测试

docker pull centos

新建容器并启动

docker run [可选参数] image

# 参数说明
--name="Name"  容器名字 tomcat01 tomcat02,用来区分容器
-d            后台方式运行
-it  		  支持交互方式运行,进入容器查看内容
-p            指定容器指定端口
	-p ip:主机端口:容器端口
	-p 主机端口:容器端口 (常用)
	-p 容器端口
-p            随机指定端口	
	

# 测试
[root@192 ~]# docker run -it centos /bin/bash
[root@793ddbd04915 /]# ls 查看容器内的centos,基础版本很多都是不完善的
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr

	

列出正在运行的容器 docker ps

[root@192 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
-a # 列出使用中的容器+历史使用的容器
-n=? # 显示最近创建的容器
-q # 只显示容器的编号
[root@192 ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                        PORTS     NAMES
793ddbd04915   centos         "/bin/bash"              6 minutes ago   Exited (127) 12 seconds ago             magical_mirzakhani
89e2db9e4f3d   centos         "/bin/bash"              7 minutes ago   Exited (0) 6 minutes ago                unruffled_dubinsky
b3ec577a7922   centos         "/bin/bash"              7 minutes ago   Created               

[root@192 ~]# docker ps -a -n=1
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                       PORTS     NAMES
793ddbd04915   centos    "/bin/bash"   10 minutes ago   Exited (127) 3 minutes ago             magical_mirzakhani

[root@192 ~]# docker ps -aq
793ddbd04915
89e2db9e4f3d
b3ec577a7922
1cd30698780a

退出容器

exit  #直接停止容器病退出
Crtl+P+Q  # 不停止容器退出

删除容器

docker rm 容器id      # 删除指定的容器,但是不能删除正在运行的容器,如果要强制删除,-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 #强制停止当前正在运行的容器

常用其他命令

后台启动容器

docker run -d 镜像名
[root@192 ~]# docker run -d centos 
0657702ab25bb5bca54c8f597d02a3dd9a2a1af69d3d672b5a2cdc58fb427afe

# docker ps 发现容器已经停止
# docker 容器使用后台运行,就必须要一个前台进程。否则docker发现没有前台进程,就会自动停止
# nginx 启动后发现自己没有提供服务,,就会立刻停止,就是没有程序了

查看日志

[root@192 ~]# dockerclogs -f -n --tall 容器id 没有日志
# 自己编写一个shell脚本

[root@192 ~]# docker run -d centos /bin/sh -c "while true;do echo xin;sleep 1;done"
f807c158c71ebe3bb3b3b10e35931d8d798b251aef346774e34053ffcca2305f

[root@192 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
f807c158c71e   centos    "/bin/sh -c 'while t…"   12 seconds ago   Up 10 seconds             happy_montalcini
[root@192 ~]# docker logs -tf --tail 10 f807c158c71e
2020-12-27T14:52:45.116051756Z xin
2020-12-27T14:52:46.118535588Z xin
2020-12-27T14:52:47.121008946Z xin
2020-12-27T14:52:48.124170058Z xin

查看容器中的进程信息ps

# docker top 容器id
[root@192 ~]# docker top f807c158c71e
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                7374                7354                0                   06:51               ?                   00:00:00            /bin/sh -c while true;do echo xin;sleep 1;done
root                7628                7374                0                   06:54               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
[root@192 ~]# 

查看容器的元数据

[root@192 ~]# docker inspect f807c158c71e
[
    {
        "Id": "f807c158c71ebe3bb3b3b10e35931d8d798b251aef346774e34053ffcca2305f",
        "Created": "2020-12-27T14:51:45.783051515Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "while true;do echo xin;sleep 1;done"
        ],
        "State": {
            "Status": "exited",
            "Running": false,
 

进入当前运行的容器

# 一般容器都是后台运行的,需要进入容器修改一些配置
# 命令
docker exec -it 容器id bashShell
# 第二种方式
docker attach -it 容器id 

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

从容器内拷贝文件到主机上

docker cp
[root@192 home]# docker cp 0372a81cfed8:/home/test.java /home
[root@192 home]# ls
linux  test.java  Xin
[root@192 home]# 

安装Nginx

docker pull nginx

# 在docker hub中搜索是否有相关镜像,使用docker pull 下载
# docker -d 后台运行
# docker --name  容器命名
# docker -p 宿主机端口:容器内部端口

[root@xin ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
6ec7b7d162b2: Already exists 
cb420a90068e: Pull complete 
2766c0bf2b07: Pull complete 
e05167b6a99d: Pull complete 
70ac9d795e79: Pull complete 
Digest: sha256:4cf620a5c81390ee209398ecc18e5fb9dd0f5155cd82adcbae532fec94006fb9
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@xin ~]# docker run -d --name nginx01 -p 3344:80 nginx
6cc8016cc96e5473a592451d5df0457fd7246f2966618d533a178c3c77226fce
[root@xin ~]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@xin ~]# 

安装Tomcat

docker pull tomcat
# 官方的使用
docker run -it --rm tomcat # 用来测试用的,用完即删除

#后台运行tomcat 
[root@192 home]# docker run -d -p 3355:8080 --name tomcat01 tomcat
17d89e7cc4052a14f8fe96e2fef12b8217714a3c920e0f37c2399e5edc4afae4

安装mysql

  1. 通过docker pull 的命令下载mysql最新版,也可以用search查询更多版本,安装其他版本的镜像
  2. 通过docker images查看镜像
[root@spring ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
a076a628af6f: Pull complete 
f6c208f3f991: Pull complete 
88a9455a9165: Pull complete 
406c9b8427c6: Pull complete 
7c88599c0b25: Pull complete 
25b5c6debdaf: Pull complete 
43a5816f1617: Pull complete 
1a8c919e89bf: Pull complete 
9f3cf4bd1a07: Pull complete 
80539cea118d: Pull complete 
201b3cad54ce: Pull complete 
944ba37e1c06: Pull complete 
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
[root@spring ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
mysql         latest    c8562eaf9d81   4 weeks ago     546MB
hello-world   latest    bf756fb1ae65   13 months ago   13.3kB

  1. 通过docker run 的命令建立mysql容器运行
# 3366:3306通过阿里云的端口访问镜像内的3306端口
[root@spring ~]# docker run -itd --name mysql01 -p 3366:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
d238a6dbe83d26670eec5f899409cdad699ce143ea75964f59970d9994a0b0f7
[root@spring ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                               NAMES
d238a6dbe83d   mysql     "docker-entrypoint.s…"   4 seconds ago   Up 3 seconds   33060/tcp, 0.0.0.0:3366->3306/tcp   mysql01

Q.E.D.