Docker学习(1)—基础命令

一、沙箱机制
独立性、隔离性
在里面运行病毒也没有关系

二、Docker是什么
Docker是一个开源的应用容器引擎,基于Go语言
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的“容器”中,然后发布到任何流行的Linux机器上,
“容器”完全使用“沙箱机制”,相互之间不会有任何接口(类似iPhone的app)

三、Docker优势
启动快
占用资源少

四、镜像/容器/仓库
1、镜像:通过镜像创建容器
类似于装系统的光盘
2、容器:镜像创建容器,容器启动起来之后,就能提供包含软件的服务了
3、仓库:镜像的集中存放地
类似于github、码云
4、容器的资源使用
容器技术是和我们的宿主机共享硬件资源及操作系统,可以实现资源的动态分配。容器包含应用和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中,在用户空间以分离的进程运行。
所有容器是共享宿主机的cpu、磁盘、内存。

五、镜像的操作
1、从仓库获取镜像
搜索镜像:docker search image_name
搜索结果过滤:
是否官方:docker search --filter "is-official=true" image_name
是否自动化构建:docker search --filter "is-automated=true" image_name
大于多少颗星星:docker search --filter stars=100 image_name
下载镜像:docker pull image_name
镜像被默认保存到 /var/lib/docker 目录下
2、本地镜像的查看:docker images
3、本地镜像的删除:docker rmi image_name/image_id
4、如果镜像比较多
列出所有的镜像ID:docker images -q
删除所有的镜像:docker rmi docker images -q

六、容器的操作
1、创建容器:docker run -itd --name=container_name image_name
注:同一个镜像可以创建多个容器,只要容器的名字不一样就可以
参数说明
-i:表示以交互模式运行
-d:表示后台运行容器,并返回容器ID
-t:为容器重新分配一个伪输入终端
–name:为容器指定名称(注意是杠杠)
2、查看容器(运行中):docker ps
3、查看容器(包括已停止的):docker ps -a
4、停止容器:docker stop container_name/container_id
5、启动容器:docker start container_name/container_id
6、重启容器:docker restart container_name/container_id
7、删除容器:docker rm container_name/container_id

例子:

[root@vmwguo0s ~]# docker run -itd –name=nginx nginx
3f04fdbe4e5e8173e31fa670ba6d0b05d96dd885fdfd9f43b05aa2d0a05b60c3
[root@vmwguo0s ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f04fdbe4e5e nginx “nginx -g ‘daemon of…” 31 seconds ago Up 22 seconds 80/tcp nginx

说明:
CONTAINER ID:容器ID的前几位,就可以标识唯一性了
IMAGE:容器使用的镜像
COMMAND:容器启动后所执行的命令
CREATED:创建时间
STATUS:状态
PORTS:端口
NAMES:我们起的名字

七、容器的修改及保存
1、进入容器:docker exec -it container_name/container_id /bin/bash
2、退出容器:exit
3、提交修改:
docker commit -a "auther" -m "message" container_id image_name:tag_name
参数说明
-a:可选,指定作者
-m:可选,提交信息
container_id:被修改容器的ID
image_name:新镜像的名称
tag_name:新镜像的标签,可不写,默认为latest

例子1:

[root@vmwguo0s ~]# docker exec -it nginx /bin/bash
root@e6390b8c2de3:/#

对容器的修改,容器不删除修改就在,从镜像重新创建容器,修改就不存在了

例子2:

root@e6390b8c2de3:/# mkdir test
root@e6390b8c2de3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var
root@e6390b8c2de3:/# exit
[root@vmwguo0s ~]# docker commit -a “zhangsan” -m “first commit” nginx zhangsan/nginx
sha256:4e8b9cb3ab7161b74463ff55d2b70f4944d4180a5335dae142e8102e811b72c5
[root@vmwguo0s ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zhangsan/nginx latest 4e8b9cb3ab71 12 seconds ago 126MB
nginx latest c7460dfcab50 9 hours ago 126MB
mariadb latest 2f11cf2ec189 3 weeks ago 355MB
php latest d0cea761b784 3 weeks ago 405MB

练习方法:
自己docker拉取一个centos镜像,在里面安装nginx,然后重新提交镜像

八、端口映射
将宿主机端口映射到容器端口
解决客户端发过来的请求与容器间的交互

1、映射
docker run -itd -p 宿主机端口号:容器端口号

例子:

[root@vmwguo0s ~]# docker run -itd –name=nginx -p 8888:80 nginx

浏览器访问:
http://IP:8888

九、文件挂载
将宿主机的文件挂载到容器里面,本地文件修改后,容器里的文件也会跟着修改
解决宿主机与容器之间的交互

1、挂载文件或文件夹(路径为全路径)
docker run -itd -v /宿主机/文件目录/文件名:/容器/目录/文件名
docker run -itd -v /宿主机/文件目录:/容器/目录

例子:
在容器外面重新建立index.html
<html>
hello docker!
</html>

docker stop nginx
docker rm nginx
docker run -itd --name=nginx -p 8888:80 -v /root/nginx:/usr/share/nginx/html nginx

2、将容器的目录或文件复制到本地
docker cp 容器名:/容器目录/文件名 /宿主机目录/文件名
docker cp 容器名:/容器目录 /宿主机目录

例子:
docker cp nginx:/etc/nginx/conf.d/default.conf /root/nginx/default.conf

3、将本地的目录或文件复制到容器
docker cp /宿主机目录/文件名 容器名:/容器目录/文件名
docker cp /宿主机目录 容器名:/容器目录

例子:
docker cp /root/nginx/default.conf nginx:/default.conf

4、容器互联
docker run -itd --link 要关联的容器名字:容器在被关联的容器中的别名
(注意是杠杠link )
如果有A和B两个容器:
A需要关联B,第一个参数是B,第二个参数是B在A中的别名

例子php和mysql:
1)先启动mysql容器
docker run -itd --name=mariadb -p 33066:3306 -v /root/mariadb:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mariadb
说明
-e:容器启动时往里面传参数
2)修改mysql密码(可略过)
alter user 'root'@'%' identified with mysql_native_password by '123456';
3)用工具登录,建立test数据,user表
插入两条记录
4)建立php脚本
vi /root/php/index.php
输入:
<?php
$pdo = new PDO('mysql:host=mariadb;dbname=test', 'root', '123456');
foreach($pdo->query('select * from user') as $row) {
print_r($row);
}
?>

5)启动php容器
docker run -itd --name=php --link mariadb:mariadb -v /root/php/index.php:/index.php php
6)进入php容器
docker exec -it php /bin/bash
7)安装php-mysql模块
docker-php-ext-install pdo_mysql
8)执行
root@ef1a4826a1f7:/# php /index.php
Array
(
[id] => 1
[0] => 1
[name] => zhangsan
[1] => zhangsan
)
Array
(
[id] => 2
[0] => 2
[name] => lisi
[1] => lisi
)

9)关于别名 --link mariadb:mariadb
在php容器中查看/etc/hosts中有:
172.17.0.3 mariadb 34899acf4b44
也就是说docker会自动给别名分配ip,所以配置里都写别名

参考资料:
https://blog.csdn.net/deng624796905/article/details/86493330