1:docker 安装时 linux内核版本过低问题
使用uname -a 可以查看linux内核的版本号,例如ubuntu会输出类似的内容:
root@ubuntu:~# uname -a
Linux ubuntu 4.4.0-142-generic #168-Ubuntu SMP Wed Jan 16 21:00:45 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
由于docker的安装条件包括了内核的条件限制:低于3.8的运行docker可能会有问题
下面来看一下如何升级linux内核
apt-get update
spt-get install linux-headers-版本号-generic等待安装完毕
然后是用update-grub启动加载器加载新内核。
最后使用reboot来重启宿主机启用新的内核。
验证以下使用uname -a看看内核版本有没有变化
2:验证docker是否已经准备就绪
docker info
使用docker可执行程序的info命令,如果docker准备就绪的话,会输出已运行的容器数量,安装的镜像数量,docker使用的执行驱动和存储驱动和docker环境的配置信息。
3:docker 是一个基于 c/s架构设计的,既能做客户端也能做服务器。做客户端时,docker程序向docker守护进程发送请求,然后在度i返回的请求结果惊醒处理。
4:运行一个容器
- 第一条命令
docker run -i -t ubuntu /bin/bash
下面来解释以下各个参数的意思:
docker run 这是docker的一条命令,
-i 标志保证容器中STDIN时开启的,持久的表中输入时交互式shell的半边天
-t 告诉docker为要创建的容器分配一个伪tty终端。另外半边天。
ubunutu 是一个镜像。
/bin/bash 告诉docker容器运行一个shell命令。
运行完上面的命令后就会i进入到ubuntu容器中,docker会给容器分配一个唯一id:dae666724601
root@ubuntu:~# docker run -i -t ubuntu /bin/bash
root@dae666724601:/#
- 第二条命令:查看主机名称
root@dae666724601:/# hostname
dae666724601
- 第三条命令:查看ip地址
root@dae666724601:/# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.4 dae666724601
- 第四条命令:容器中安装vim
root@dae666724601:/# apt-get update && apt-get install vim
- 第五条命令:退出容器,回到宿主机
root@dae666724601:/# exit
exit
这条命令会结束容器的运行。可以使用虾米那一条命令来看一下容器是否已经结束运行了
- 第六条命令。这里也可以使用-a 参数
root@ubuntu:~# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dae666724601 ubuntu "/bin/bash" 18 minutes ago Exited (0) 6 seconds ago heuristic_poincare
-l参数是列出最后一次运行的容器,亲测只包括已经停止的。
-a参数是查看当前系统中容器的列表(已经停止的和正在运行的),来看一下两者的输出区别:
root@ubuntu:~# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dae666724601 ubuntu "/bin/bash" 18 minutes ago Exited (0) 6 seconds ago heuristic_poincare
root@ubuntu:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dae666724601 ubuntu "/bin/bash" 22 minutes ago Exited (0) 3 minutes ago heuristic_poincare
8b7fa227bca2 mysql "docker-entrypoint.s…" 17 hours ago Up 17 hours 33060/tcp, 0.0.0.0:3307->3306/tcp second_mysql
df6e780fb24a mysql "docker-entrypoint.s…" 17 hours ago Up 17 hours 0.0.0.0:3306->3306/tcp, 33060/tcp first-mysql
从上面的输出结果可以看出来,NAMES这一列,系统给自动分配了一个随机的名字。下面来说一下容器的命名
- 第七条命令:容器的命名。在启动容器的时候可以加上--name参数来指定容器的名字,从而避免随机命名。
root@ubuntu:~# docker ps -al
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd1ee14b8f14 ubuntu "/bin/bash" 19 seconds ago Exited (0) 5 seconds ago smeon_ubuntu
细心的同学应该会发现容器的唯一id和名字都变了。是的,我们在使用run命令的时候,docker是会进行创建和运行两步操作的,但是用的是同一个镜像。所以使用docker ps -a 会看到有两个ubuntu容器已经停止了。
root@ubuntu:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd1ee14b8f14 ubuntu "/bin/bash" 27 seconds ago Exited (0) 14 seconds ago smeon_ubuntu
dae666724601 ubuntu "/bin/bash" 31 minutes ago Exited (0) 13 minutes ago heuristic_poincare
8b7fa227bca2 mysql "docker-entrypoint.s…" 17 hours ago Up 17 hours 33060/tcp, 0.0.0.0:3307->3306/tcp second_mysql
df6e780fb24a mysql "docker-entrypoint.s…" 17 hours ago Up 17 hours 0.0.0.0:3306->3306/tcp, 33060/tcp first-mysql
那如果像复用之前已经停止的容器该怎么办呢?这就需要使用另一个命令。
- 第八条命令:docker start 容器名字/唯一段id/唯一长id.让我们来试一下吧:
root@ubuntu:~# docker start smeon_ubuntu
smeon_ubuntu
root@ubuntu:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd1ee14b8f14 ubuntu "/bin/bash" 6 minutes ago Up 50 seconds smeon_ubuntu
dae666724601 ubuntu "/bin/bash" 37 minutes ago Exited (0) 19 minutes ago heuristic_poincare
8b7fa227bca2 mysql "docker-entrypoint.s…" 17 hours ago Up 17 hours 33060/tcp, 0.0.0.0:3307->3306/tcp second_mysql
df6e780fb24a mysql "docker-entrypoint.s…" 17 hours ago Up 17 hours 0.0.0.0:3306->3306/tcp, 33060/tcp first-mysql
可以看到之前停止的指定名字的容器已经启动了。另外两种方式可以自己去试一下。另外还可以使用docker restart 容器名字/唯一段id/唯一长id 来重启容器。
- 第九条命令:停止一个 已经启动的容器 docker stop容器名字/唯一段id/唯一长id
root@ubuntu:~# docker stop smeon_ubuntu
smeon_ubuntu
root@ubuntu:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd1ee14b8f14 ubuntu "/bin/bash" 9 minutes ago Exited (0) 5 seconds ago smeon_ubuntu
dae666724601 ubuntu "/bin/bash" 40 minutes ago Exited (0) 22 minutes ago heuristic_poincare
8b7fa227bca2 mysql "docker-entrypoint.s…" 17 hours ago Up 17 hours 33060/tcp, 0.0.0.0:3307->3306/tcp second_mysql
df6e780fb24a mysql "docker-entrypoint.s…" 17 hours ago Up 17 hours 0.0.0.0:3306->3306/tcp, 33060/tcp first-mysql
- 第十条命令:attach 命令
root@ubuntu:~# docker attach heuristic_poincare
root@dae666724601:/#
这里需要注意的是:如果容器时停止的,attach 的时候会失败。
- 第十一条命令:创建一个守护式容器。上面我们创建的是一个交互式的容器
root@ubuntu:~# docker run --name daemon_ubuntu -d ubuntu /bin/bash -c "while true; do echo hello world;sleep 1; done"
6b2bd21daf3362e1b7cc75ede26eaf691f1d09926fa3fb5f99c1309a01f69f69
-d 参数是一个后台运行的参数
-c 参数是一直循环输出hello world,直到容器或进程停止。
问题来了:怎么能看到上一条命令的输出呢?这需要下一条命令:
- 第十二条命令 : docker logs daemon_ubuntu(ctr +c 可以退出日志查看)
root@ubuntu:~# docker logs daemon_ubuntu
hello world
hello world
hello world
hello world
hello world
...
如果不想查看所有日志,只需要追踪最新的logs日志,有没有向tail -f 一样的参数呢?大难是肯定的。
docker logs --tail 10 -f daemon_ubunt 使用参数 --tail 即可以查看最近10条的日志。
- 第十三条命令 :查看容器内的进程
root@ubuntu:~# docker top daemon_ubuntu
UID PID PPID C STIME TTY TIME CMD
root 13148 13131 0 10:13 ? 00:00:00 /bin/bash -c while true; do echo hello world;sleep 1; done
root 13996 13148 0 10:21 ? 00:00:00 sleep 1
- 第十四条命令:在容器内运行进程。
root@ubuntu:~# docker exec -d smeon_ubuntu touch /home/config_file.conf
root@ubuntu:~# docker restart smeon_ubuntu
smeon_ubuntu
root@ubuntu:~# docker attach smeon_ubuntu
root@dd1ee14b8f14:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@dd1ee14b8f14:/# cd home/
root@dd1ee14b8f14:/home# ls
config_file.conf
-d 参数 表明要运行一个后台进程
-d之后是指明容器的名字,以及需要执行的命令。这里创建一个空的配置文件。
通过docker exec 命令可以在正在运行的容器中进行维护,监控和管理任务。
再举一个例子:在start 或restart的一个容器的时候不会进入到对应的容器内。也就是不会进入到交互式界面,这时候可以使用docker exec 来进入shell交互式界面。
root@ubuntu:~# docker exec -i -t smeon_ubuntu /bin/bash
root@dd1ee14b8f14:/#
- 第十五条命令:自动重启容器。
root@ubuntu:~# docker run --restart=always --name daemon_ubuntu -d ubuntu /bin/bash -c "while true; echo hello world; sleep 1 ; done"
docker: Error response from daemon: Conflict. The container name "/daemon_ubuntu" is already in use by container "6b2bd21daf3362e1b7cc75ede26eaf691f1d09926fa3fb5f99c1309a01f69f69". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
注意这个--resatrt参数是只有run 命令才有的,start 和restart没有该参数。run 会创建新的容器。
- 第十六条命令:除了docker ps 来获取容器的信息外,深入获取容器信息。
root@ubuntu:~# docker inspect daemon_ubuntu
[
{
"Id": "6b2bd21daf3362e1b7cc75ede26eaf691f1d09926fa3fb5f99c1309a01f69f69",
"Created": "2020-05-28T02:13:05.496480088Z",
"Path": "/bin/bash",
"Args": [
"-c",
"while true; do echo hello world;sleep 1; done"
],
"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 137,
"Error": "",
"StartedAt": "2020-05-28T02:22:28.858219855Z",
"FinishedAt": "2020-05-28T02:52:01.914573489Z"
},
"Image": "sha256:1d622ef86b138c7e96d4f797bf5e4baca3249f030c575b9337638594f2b63f01",
"ResolvConfPath": "/var/lib/docker/containers/6b2bd21daf3362e1b7cc75ede26eaf691f1d09926fa3fb5f99c1309a01f69f69/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/6b2bd21daf3362e1b7cc75ede26eaf691f1d09926fa3fb5f99c1309a01f69f69/hostname",
"HostsPath": "/var/lib/docker/containers/6b2bd21daf3362e1b7cc75ede26eaf691f1d09926fa3fb5f99c1309a01f69f69/hosts",
"LogPath": "/var/lib/docker/containers/6b2bd21daf3362e1b7cc75ede26eaf691f1d09926fa3fb5f99c1309a01f69f69/6b2bd21daf3362e1b7cc75ede26eaf691f1d09926fa3fb5f99c1309a01f69f69-json.log",
"Name": "/daemon_ubuntu",
...
}
]
inspect命令返回的参数比较多,可以通过--format参数来输出指定的配置信息。例如:
root@ubuntu:~# docker inspect --format='{{.State.Status}}' daemon_ubuntu
exited
- 第十七条命令:删除容器:docker rm 容器名字/唯一短ID/唯一长ID
root@ubuntu:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6b2bd21daf33 ubuntu "/bin/bash -c 'while…" 45 minutes ago Exited (137) 6 minutes ago daemon_ubuntu
dd1ee14b8f14 ubuntu "/bin/bash" About an hour ago Up 26 minutes smeon_ubuntu
dae666724601 ubuntu "/bin/bash" 2 hours ago Exited (0) 53 minutes ago heuristic_poincare
8b7fa227bca2 mysql "docker-entrypoint.s…" 18 hours ago Up 18 hours 33060/tcp, 0.0.0.0:3307->3306/tcp second_mysql
df6e780fb24a mysql "docker-entrypoint.s…" 18 hours ago Up 18 hours 0.0.0.0:3306->3306/tcp, 33060/tcp first-mysql
root@ubuntu:~# docker rm heuristic_poincare
heuristic_poincare
root@ubuntu:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6b2bd21daf33 ubuntu "/bin/bash -c 'while…" 46 minutes ago Exited (137) 7 minutes ago daemon_ubuntu
dd1ee14b8f14 ubuntu "/bin/bash" About an hour ago Up 26 minutes smeon_ubuntu
8b7fa227bca2 mysql "docker-entrypoint.s…" 18 hours ago Up 18 hours 33060/tcp, 0.0.0.0:3307->3306/tcp second_mysql
df6e780fb24a mysql "docker-entrypoint.s…" 18 hours ago Up 18 hours 0.0.0.0:3306->3306/tcp, 33060/tcp first-mysql
root@ubuntu:~#
各位至此,docker的入门基本已经结束,欢迎收藏+推荐