docker学习笔记
bios
1.docker images 列出本地主机上的镜像。
2.docker pull 从Docker Hub中拉取或者更新指定镜像。
3.docker ps
-a 查看已经创建的容器
-s 查看已经启动的容器
systemctl enable docker # 开机自动启动docker
systemctl start docker # 启动docker
systemctl restart docker # 重启dokcer
4.每次启动一个mysql镜像的时候,数据库都是空的,每次操作的时候都要重新建表,这个非常不友好。
我们可以使用-v 来挂载本地的数据库文件到mysql镜像中的/var/lib/mysql目录下。
docker run -i -t -v -p 3306:3306 /var/lib/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=hsulei mysql
5.docker start con_name 启动容器名为con_name的容器。
6.docker stop con_name 停止容器名为con_name的容器。
7.docker rm con_name 删除容器名为con_name的容器。
8.docker rmi img_name 删除镜像名为img_name的镜像。
9.docker rename old_name new_name 重命名一个容器。
10. docker exec -it 9a57(容器ID) /bin/bash 进入容器
[root@localhost backup]# vim /etc/docker/daemon.json
[root@localhost backup]# cat /etc/docker/daemon.json
{ "insecure-registries":["134.70.92.8:5000","192.168.89.11:5000","134.83.2.191:5000"] }
-----------------------------------------
1、重启docker服务报错
[root@localhost ~]# systemctl restart docker
Job for docker.service failed because start of the service was attempted too often. See "systemctl status docker.service" and "journalctl -xe" for details.
To force a start use "systemctl reset-failed docker.service" followed by "systemctl start docker.service" again.
解决方案:
运行命令:
echo '{ "insecure-registries":["134.70.92.8:5000","192.168.89.11:5000"] }' > /etc/docker/daemon.json
systemctl restart docker
例:
echo '{ "insecure-registries":["134.70.92.8:5000","192.168.89.11:5000"] }' > /etc/docker/daemon.json.rpmsave \
&& service docker restart \
&& docker pull 192.168.89.11:5000/nginx:alpine \
&& docker images | grep nginx
2、拉取 docker 镜像报错
[root@localhost ~]# docker pull 134.70.92.8:5000/mysql:5.7.20
Error response from daemon: Get https://134.70.92.8:5000/v2/: http: server gave HTTP response to HTTPS client
解决方案:
通过dig @114.114.114.114 registry-1.docker.io找到可用IP
查看当前所有docker镜像
[root@localhost mysql_data]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest a8a59477268d 7 weeks ago 445MB
hello-world latest e38bc07ac18e 2 months ago 1.85kB
134.70.92.8:5000/mysql 5.7.20 5709795eeffa 7 months ago 408MB
3、创建docker 容器
docker run -t -i ubuntu:15.10 /bin/bash
docker run -i -t -e MYSQL_ROOT_PASSWORD=hsulei mysql
docker run -tid 镜像ID/usr/sbin/init //centos7版本。使用/usr/sbin/init解决systemctl报错不能使用的问题
4、创建一个MySQL容器并运行:
sudo docker run -e MYSQL_ROOT_PASSWORD=coco2017(自己设置密码) --name mysql -d mysql
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=coco2017 -d mysql:5.7
docker run --rm \
--name mysql -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=coco2017 \
-v /root/config:/etc/mysql \
-ti 134.70.92.8:5000/mysql:5.7.20 bash
docker run \
--name mysql -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=coco2017 \
-v /root/config:/etc/mysql \
-v /home/mysql/data:/var/lib/mysql \
-d 134.70.92.8:5000/mysql:5.7.20
[root@localhost mysql_data]# docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=coco2017 -d 134.70.92.8:5000/mysql:5.7.20
c79ff7e958cfa6c6267318757f8f3cbe250b081668530ad880791210e53728c6
[root@localhost mysql_data]# docker ps -s
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
c79ff7e958cf 134.70.92.8:5000/mysql:5.7.20 "docker-entrypoint.s…" 9 seconds ago Up 7 seconds 0.0.0.0:3306->3306/tcp mysql 0B (virtual 408MB)
进入mysql容器:docker exec -it c79ff(容器ID) /bin/bash
docker run
-d 标识是让 docker 容器在后台运行。
-p 标识通知 Docker 将容器内部使用的网络端口映射到我们使用的主机上。
--name 定义一个容器的名字,如果在执行docker run时没有指定Name,那么deamon会自动生成一个随机数字符串当做UUID。
-e 设置环境变量,或者覆盖已存在的环境变量。
例如:
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -d mysql/mysql-server:latest
含义:容器的名字为mysql,将容器的3306端口映射到本机的3306端口,mysql数据库的密码为password ,运行的镜像为mysql/mysql-server:latest
docker run -i -t -e MYSQL_ROOT_PASSWORD=hsulei mysql
5、查看错误:docker logs 加容器名
[root@localhost ~]# docker logs 7a589dbe54f9
6.docker容器创建后没有启动成功,如下是logs报错日志:
[root@localhost ~]# docker logs 7a589dbe54f9
error: database is uninitialized and password option is not specified
You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
解决方案:
于是设置MYSQL_ROOT_PASSWORD:
sudo docker run -e MYSQL_ROOT_PASSWORD=wwwwww --name mysql -d mysql
7.新运行一个容器后,然后docker ps -a 发现容器已经退出
原因:docker容器后台运行,就必须有一个前台进程,容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就会自动退出的。
例:service nginx start && php5 -fpm start
解决方案:将要运行的程序以前台进程的形式运行,如果容器需要同时启动多个进程,那也只需要或者说只能将其中一个挂起到前台即可。
service php5 -fpm start && nginx -g "daemon off;"
其实只要在任何命令之后加一句 && cat,就会让这条命令卡在前台而不会结束,不是非得用daemon off
8.默认镜像中并没有安装vi或者vim,需要手工安装:
apt-get update && apt-get -yq install vim
9.在宿主机上安装mysql后,登录mysql:
[root@localhost mysql_data]# mysql -uroot -h192.168.133.128 -P3306 -p
登录后授权一个远程登录账户:
MySQL [(none)]> grant all privileges on *.* to 'test'@'%' identified by 'test' with grant option;
通过查看/entrypoint.sh脚本内容,总结参数如下:
mysqld #启动mysql服务,必须使用
MYSQL_ROOT_PASSWORD #设置mysql的root密码,必须使用
#以下二个参数添加除root之外的用户并设置密码,可选。
MYSQL_USER
MYSQL_PASSWORD
#设置生成容器时需要新建的数据库,可选
MYSQL_DATABASE
#容器的mysql数据库默认的保存路径是:
/var/lib/mysql
#容器的配置文件my.cnf的路径为:
/etc/mysql/my.cnf
10.docker中查看进程
root@c79ff7e958cf:/# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
mysql 1 0.1 21.1 1124744 211364 ? Ssl 12:16 0:21 mysqld
root 388 0.0 0.1 20240 1992 pts/0 Ss 15:16 0:00 /bin/bash
root 393 0.0 0.1 17492 1144 pts/0 R+ 16:01 0:00 ps aux
11.备份docker 中的mysql
[root@localhost backup]# mysqldump -uroot -proot -h192.168.133.128 -B -A -F --master-data=2 --single-transaction --events|gzip > /opt/backup/back_20180704.sql.gz
12、在docker容器中安装ifconfig、ping等工具
安装ifconfig命令
apt-get install net-tools
安装ping命令
apt-get install iproute2
安装ssh
apt-get install openssh-server service ssh start
关闭防火墙
ufw disable
在PC中添加到容器的路由
以管理员身份运行CMD并执行如下命令:
route add 172.17.0.0 mask 255.255.255.0 192.168.209.165 其中172.17.0.0为容器所在网段,192.168.209.165为容器的宿主机的IP地址
13、将mysql的数据目录和配置文件放在宿主机上,挂载到docker容器中
[root@localhost data]# docker run \
--name mysql -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=coco2017 \
-v /root/config:/etc/mysql \
-v /home/mysql/data:/var/lib/mysql \
-d 134.70.92.8:5000/mysql:5.7.20
0acbbb73f95ddc66b294dc03d6e8fe1729efb957e4e6c67460e108641c46f038
14、启动MySQL 容器后,在宿主机登陆MySQL报错:
[root@localhost data]# mysql -uroot -pcoco2017 -h192.168.133.129
-bash: mysql: 未找到命令
答:在宿主机上检查是否安装了MySQL
[root@localhost data]# rpm -qa|grep -i mysql
在宿主机上安装MySQL:[root@localhost data]# yum install mysql
yum install perl-DBD-MySQL -y
安装完成后再次登陆:
[root@localhost data]# mysql -uroot -pcoco2017 -h192.168.133.129
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.20 MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> show databases;
15、开放3306端口,--permanent 永久开启,避免下次开机需要再次手动开启端口
[root@VM_0_17_centos ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
[root@VM_0_17_centos ~]# firewall-cmd --reload
mkdir config
docker cp mysql:/etc/mysql/ config
-----------------------------适用docker安装MySQL,并将数据挂载到本地目录--------------------------------------------------
1、查找mysql镜像
sudo docker search mysql
2、拉取mysql镜像
sudo docker pull mysql
3、运行mysql镜像,名字为mysql,将/var/lib/mysql挂载到本地目录/opt/mysql/data ,设置root密码为123456
sudo docker run -p 3306:3306 --name mysql -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
4、查看容器启动情况,-a包括未启动的容器
sudo docker ps
5、进入容器
sudo docker exec -it mysql /bin/bash
mysql -u root -p 123456 登陆容器内数据库
停止容器
sudo docker stop mysql
删除容器(非运行状态)
sudo docker rm mysql
6.查看docker 日志:
[root@host-192-168-88-11 soft]# docker logs elasticsearch
从主机复制到容器sudo docker cp host_path containerID:container_path
从容器复制到主机sudo docker cp containerID:container_path host_path
sudo docker cp /opt/soft/elasticsearch-analysis-ik-6.2.4.zip elasticsearch:/
docker运行es,将数据目录挂载到宿主机:
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-v /data/elasticsearch/data/:/usr/share/elasticsearch/data \
-d 134.70.92.8:5000/elasticsearch:6.2.4